본문 바로가기
Java/기본 개념 및 클래스

[Java] 67. 쓰레드의 개념과 사용 방법

글: Song hyun 2024. 5. 1.
728x90
반응형

[Java] 67. 쓰레드의 개념과 사용 방법

1. 쓰레드의 정의
2. 쓰레드를 추가로 만들어 사용하기
3. 쓰레드 상태



1. 쓰레드(Thread)의 정의
(1) 저장되어 있는 프로그램이 실행되면, OS로부터 메모리를 할당받아, 프로세스 상태가 된다.
(2) 하나의 프로세스는 하나 이상의 쓰레드를 가지게 된다.
쓰레드란 실제 작업을 수행하는 단위이다.

-> 프로그램이 실행되면, 그것을 프로세스(메모리 관점)이라고 부를 수 있다.
-> 각각의 프로세스들은 하나 이상의 쓰레드를 가지게 된다.


(3) 데이터는 RAM에 저장되고, CPU가 연산 및 계산 처리를 한다.
그리고 둘 사이에는 쓰레드 스케쥴러가 존재한다. 
(4) 쓰레드 스케쥴러는 자동적으로 쓰레드의 연산을 처리하고, 교체해준다. 
이를 컨텍스트 스위칭(Context Switching)이라고 부른다.




2. 쓰레드를 추가로 만들어 사용하기
(1) Thread 클래스를 상속하여 추가로 만들기

 

첫번째 방법: 상속을 활용할 수 있다.
-Thread -> Runnable -> Run()

-Thread 클래스 상속을 통해 쓰레드를 구현할 경우, Thread의 매개변수(파라미터)로 받은Runnable 객체를 저장하게 된다.  


**쓰레드를 사용할 때 알아야 하는 필수 개념 - 그냥 외우자!**
쓰레드가 가지고 있는 메서드 start() 호출시키면, 
약속으로 run() 메서드가 호출되어 동작하게 만들어져 있다.

 

**쓰레드를 실행시키기 위해서는 start()메서드를 호출해야 한다.
해당 메서드를 호출하면 각 쓰레드들이 실행 대기 상태가 되는데,
이후 자신의 차례가 오면 실행이 된다.

start()는 오로지 한 번만 호출할 수 있으며, 이는 곧 실행이 종료된 쓰레드는 다시 실행할 수 없다는
의미와 같다. 동일한 작업을 여러번 수행하기 위해서는 매번 새로운 쓰레드를 생성해야 한다. 


(2) Runnable 인터페이스 구현하기

두번째 방법. Runnable 인터페이스를 implements함으로써 쓰레드를 만든다.
-다른 클래스를 상속했을 경우, Thread 클래스를 상속받지 못한다.

때문에 Runnable 인터페이스를 구현해 사용하는 것이 더욱 편리하다.

 

* Runnable 인터페이스 내부에는 Run() 메서드가 구현되어 있기 때문에, 자신의 멤버변수인 Runnable-Run()을 통해
Run()메서드를 구현할 수 있다.

** Runnable 인터페이스는 오로지 run()메서드만 선언되어 있는 간단한 인터페이스이다.


3. 쓰레드 상태(Thread Status)란?

 

 

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(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
package useful.ch05;

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

}
728x90
반응형