[자바 기초] Thread(1) - 기본 및 스케쥴링

프로세스와 쓰레드

프로세스 - 실행 중인 프로그램. 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 된다.

쓰레드 - 프로세스의 자원을 이용해서 실제로 작업을 수행한다. 프로세스의 자원을 공유한다는 것이 핵심이다. 해당 용어는 1코어 4쓰레드에서 흔히 쓰이는 쓰레드와 다르다. 1코어 4쓰레드에서의 쓰레드는 물리적인 작업의 단위이고, 현재 언급된 쓰레드는 논리적 쓰레드로 흔히 프로그래밍을 할 때 말하는 일반적인 프로그램의 작업을 수행하는 쓰레드이다.

멀티쓰레딩의 장점

멀티쓰레딩의 단점

쓰레드 구현방법

  1. Thread 클래스 상속
     class MyThread extends Thread {
     	public void run() { // ... } // Thread 클래스 run()을 오버라이딩
     }
        
     // ...
        
     thread.start(); // 실행대기 중이다가, 자신의 차례오면 실행
    
  2. Runnable 인터페이스 구현
    class MyThread implements Runnable {
    	public void run() { // ... } // Runnable 인터페이스의 run()을 구현
    }
        
    // ...
        
    Thread thread = new Thread(runnable);
    thread.start();
    
        - Thread 상속 시 다른 클래스의 상속을 못받으니 Runnable 구현하는 방법이 일반적이다.
        - Runnable 구현은 재사용성이 높고 코드 일관성 유지하기에 좋아 보다 객체지향적이다.
        - 쓰레드를 구현한다는 것은 작업 내용으로 run()의 블록을 채우는 것이다.
        - Runnable은 실행시 Thread 클래스 생성자에 넣어서 실행해야한다.
    

start()와 run()

main 메서드에서 run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 선언된 메서드를 호출하는 것이다. 따라서 콜스택은 아래와 같이 된다.

run()
main()

start()는 새로운 쓰레드가 작업을 실행하는데 필요한 콜스택을 생성하고 다음에 run()을 호출해서, 생성된 콜스택에 run()이 첫번째로 올라가게 한다. 모든 쓰레드는 독립적인 작업 수행을 위해 자신만의 콜스택이 필요하다.

  1. start() 호출
start()
main()
  1. 새로운 쓰레드의 콜스택 생성
start()   BLANK
main()   BLANK
  1. 새로운 콜스택에서 run() 호출
start()   BLANK
main()   run()
  1. 두 개의 쓰레드에서 작업
start()   BLANK
main()   run()

싱글 쓰레드, 멀티 쓰레드

쓰레드 우선순위 (1 ~ 10)

쓰레드 그룹

ThreadEx9

daemon thread

ThreadEx10

쓰레드의 실행제어 (스케쥴링)

메서드 설명  
  static void sleep(long mills, int nanos) 지정된 시간 (1/1000) 동안 쓰레드 일시정지. 지정시간 후, 실행대기(RUNNALBE 상태)
  void join(long mills, int nanos) 지정된 시간동안 쓰레드 실행, 지정 시간 후 작업종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행계속. 일종의 대기
  void interrupt() sleep()이나 join()에 의해 일시정지된 쓰레드를 실행대기 상태로 만든다. 해당 쓰레드에서는 InterruptException이 발생함으로써 일시정지 상태 해제
  void stop() 쓰레드 즉시 종료
  void suspend() 쓰레드 일시정지
  void resume() suspend()에 의한 일시정지를 실행대기 상태로
  static void yield() 실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보하고 자신은 실행대기 상태로
상태 설명  
NEW 쓰레드 생성되고 아직 start() 호출 안된 상태  
  RUNNABLE 실행 중 또는 실행 가능한 상태
  BLOCKED 동기화 블럭에 의해 일시정지된 상태(lock이 풀릴때까지 대기)
  WAITING 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 상태
  TIMED_WATING (unrunnable)일시정지 상태. TIME_WAITING은 일시정지 시간 지정된 경우
  TERMINATED 쓰레드의 작업이 종료된 상태

https://lh4.googleusercontent.com/oR0_liUxjMnfgFS-fSuc0x2vCCPLQ0Vdw6w2rBVGloaE_84tRNprqNJEJiyI1unMY8Vpj2CDK9GiQGy03_RmteRz-aM31iIQcZsVZhIH2cLrne_5nY9miXKDmQqEHdY60_WopC0

RUNNBALE은 쓰레드 Queue

sleep() - 일정시간동안 쓰레드를 멈추게 한다.

interrupt()와 interrupted() - 쓰레드의 작업을 취소한다.

ThreadEx13

ThreadEx14

suspend(), resume(), stop() - Deprecated (Deadlock - suspend, stop)

ThreadEx15

yield() - 다른 쓰레드에게 양보한다

ThreadEx16

join() - 다른 쓰레드의 작업을 기다린다

ThreadEx17

ThreadEx18

TODO : 작성한 코드 레퍼런싱하기, 다음 주제는 동기화