CNOW 2024. 5. 1. 10:48
💡 학습 목표
  1. 쓰레드(Thread)란 뭘까?
  2. 쓰레드를 추가로 만들어서 사용하는 방법을 알아 보자.
  3. 쓰레드의 실행시 쓰레드 상태라는 개념을 알아 보자.

 

1. 쓰레드(Thread)란 뭘까?

Thread 란?

  • process란? 저장되어 있는 프로그램이 실행되면 OS로 부터 메모리를 할당받아 프로세스 상태가 된다.
  • 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread이다.

 

그림1
하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread 이다.

 

 

2. 쓰레드를 추가로 만들어서 사용하는 방법을 알아 보자.

1. 첫번째 방법은 Thread 클래스 상속하여 만들 수 있습니다.

package useful.ch05;

/**
 * 쓰레드를 추가하는 방법 - 상속을 활용할 수 있다. 
 * Thread --> Runnable --> run() 
 */
public class MyThread extends Thread  {

	// 우리가 정의한 클래스에서 run() 메서드 재정의 할 수 있다. 
	// 쓰레드를 사용할 때 알아야 하는 필수 개념 - 그냥 외우자! 
	// 쓰레드가 가지고 있는 메서드 start() 호출 시키면 약속으로 
	// run() 메서드 호출 되어 동작하게 만들어져 있다. 
	@Override
	public void run() {
		// 우리가 동작 시키고자 하는 일을 정의해서 코드를 설계할 수 있다. 
		// 임무 -> 반복문 200을 수행해! 
		for (int i = 0; i < 200; i++) {
			System.out.println(i + ", ");
			
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
	}
	
	
} // end of class

 

package useful.ch05;

public class MyThreadMainTest {
	
	// 기본적으로 메인 작업자 하나를 가지고 있다. 메인 쓰레드라 한다. 
	public static void main(String[] args) {
		
		System.out.println(Thread.currentThread());
		
		// 필요하다면 추가 작업자를 사용할 수 있다. 
		MyThread th1 = new MyThread(); 
		th1.start(); // start 호출되면 run() 메서드가 동작되게 약속 되어 있다.
		System.out.println("----------------------");
		
		// 필요하다면 추가 작업자를 더 만들 수 있다. 
		MyThread th2 = new MyThread();
		th2.start();
		

	} // end of main 

} // end of class

 

package useful.ch05;

// HOW , WHY 
public class Worker extends Thread {
	
	private String name; 
	
	public Worker(String name) {
		this.name = name;
	}
	
	// 약속된 부분 --> run() 메서드를 정의 하면 된다. 
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("worker : " + name + " : " + i);
			
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
	}
	
	
}

 

package useful.ch05;

public class WorkerMainTest {

	// 메인 작업자 
	public static void main(String[] args) {
		System.out.println("---------- main 쓰레드 시작 -------------");
		System.out.println(Thread.currentThread());
		
		// 작업자 하나 만들어 내기 
		Worker worker1 = new Worker("워커1"); // 생성은 메인 쓰레드가 했다. 
		// 명령어를 통해서 워커1에게 너가 위임 받은 일을 시작해 
		worker1.start(); // 메인 쓰레가 명령 내림 
		
		System.out.println("------- main 쓰레드 종료 ------------ ");
	}

}

 

 

 

2. 두번째 방법은 Runnable 인터페이스 구현하여 만들 수 있습니다.

package useful.ch05;

/**
 * 쓰레드를 만드는 두번째 방법 Runnable 인터페이스를 
 * 활용하는 방법 
 */
public class MyThread2 implements Runnable {
	
	// Thread 클래스에서 start 메서드가 호출 되면 
	// 동작하는 부분이라고 약속 되어 있다. 
	@Override
	public void run() {
		int i = 0; 
		while(i < 10) {
			System.out.println("i : " + i);
			i++;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} 
	}

}

 

package basic.useful.ch05;

public class MyThread2MainTest {
	
	// 메인 작업자 
	public static void main(String[] args) {
		System.out.println("main start");
		System.out.println(Thread.currentThread());
		
		MyThread2 mythread2 = new MyThread2();
//		mythread2.run(); 일반 메서드 호출이다.
		
		// 새로운 작업자를 생성해서 위임 시킬때는 Thread 안에 있는 start() 메서드를 호출해야 된다.
		
		
		new Thread(mythread2).start();
		
		// 이렇게도 된다.
//		Thread thread1 = new Thread(myThread2);
//		thread1.start();
		
		
		
		// 결국 다른 작업자에게 일을 위임하려면 쓰레드에 start()를 호출 해야해!
		System.out.println("--- end main thread ---");
		
		// 문제 MyThread2를 메모리에 올리고 
		// 그 안에 정의된 run() 메서드를 호출하시오
		// 힌트 : Thread 문서를 반드시 확인하시오
		
		
	}

}

 

3. 쓰레드의 실행시 쓰레드 상태라는 개념을 알아 보자

Thread Status

 

 

정리

스레드(Thread)란?

스레드는 프로세스 내에서 실제로 작업을 수행하는 단위입니다. 모든 자바 프로그램은 메인 스레드에서 시작되며, 사용자는 추가적인 스레드를 생성할 수 있습니다. 각 스레드는 독립적으로 실행되며, 자신만의 호출 스택을 가집니다.(각 쓰레드의 스택 영역은 서로 격리되어 있습니다) 프로세스 내의 모든 스레드는 같은 Heap 메모리 공간과 다른 자원을 공유할 수 있습니다.