* Thread

   > 한 번 사용한 쓰레드는 다시 재사용할 수 없다 (즉, start()가 한번만 호출 될 수 있다)

   > Thread 간 Switching 이 Process 간 Switching 이 더 오래 걸린다 (더 많은 정보를 저장 해야되기 때문)

 

* Priority

   > 숫자가 높을 수록 우선 순위가 높다 (1~10)

   > Main Thread 의 Priority 는 5이다.

   > 우선 순위는 쓰레드를 생성한 쓰레드로부터 상속받는다 (Main Thread 에서 생성한 경우는 5)

 

* Thread Group

   > Java App 이 실행되면 JVM은 Main 과 System 이라는 Thread 그룹을 만든다. Main Thread 는 Main Thread 그룹에

      속하고, GC를 수행하는 Finalizer Thread는 System Thread 그룹에 속한다.

   > 개발자가 생성하는 모든 Thread or Thread Group 은 Main Thread 그룹 하위에 생성된다.

 

* Daemon Thread

   > 생성 후, 실행하기 전에 setDaemon(true) 호출

   > 무한 loop와 조건문을 이용해서 실행 후 대기하고 있다가, 특정 조건이 만족되면 작업을 수행 후 다시 대기
      (GC, 워드프로세서의 자동 저장, 화면 자동 갱신 등)

   > 데몬 쓰레드가 생성한 모든 쓰레드는 데몬 쓰레드가 된다.

 

* start()

   > 새로운 쓰레드가 작업을 실행하는데 필요한 콜스택을 생서한 다음에 run() 을 실행

   > 새로운 쓰레드를 만들때마다 새로운 콜스택이 생성되었다가 소멸된다.

   > 단, 하나의 쓰레드라도 종료되지 않으면, Process 가 종료되지 않는다

 

* interrupt()

   > block 상태에서만 동작한다

   > while() 안의 동작이 수행되는 경우, interrupt() 가 호출되어도 멈추지 않는다. 단지, flag 값만 바꾼다.
     따라서, isInterrupted() 조건문 등을 통해 loop 를 빠져나오기 위한 코드가 필요하다.

   > interrupt 가 발생하면 isInterrupted() 가 true 로 되지만, try-catch 블럭에 의해 예외처리 되는 경우에 다시 false 로
      설정된다. 따라서, catch 블럭에서 다시 값을 true 로 설정해주어야 이후에 코드에서 isInterrupted() 를 통한 확인이

      가능하다

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    thread.interrupt();
}

 

* Thread.sleep()

   > Static Method 로써, 현재 실행중인 쓰레드에 대해 동작

   > 아래 코드에서 Worker Thread 가 아닌 Main Thread에 대하여 sleep() 이 호출된다.
      (즉, wt.sleep(3000) = Thread.sleep(3000))

Thread wt = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("worker");
    }
});
wt.start();
wt.sleep(3000);

 

* Thread.yield()

   > Static Method 로써, 현재 실행중인 쓰레드에 대해 동작

   > 우선순위가 동일한 다른 스레드에게 실행을 양보하고 실행 대기 상태가 된다.

   > loop 를 계속 도는 Busy-Waiting 상태가 되면 자원이 낭비된다. 아래와 같이 yield() 메소드를 통해 다른 쓰레드가

      작업을 할 수 있도록 양보할 수 있다.

      (실행 대기 상태에 있는 쓰레드는 isStopped 변수 값을 바꾸거나 하면, Scheduler 에 의해 다시 실행되는 것으로 
       보이지만, 확실하지는 않다)

   > 참고 : https://www.baeldung.com/java-thread-yield

@Override
public void run() {
    while(true) {
        if (isStopped) {
            Thread.yield();
        } else {
            System.out.println(msg);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

'SW > ::: Java' 카테고리의 다른 글

Stream (스트림)  (0) 2020.10.09
JVM (시작, 종료, 예외처리, 동기화)  (0) 2020.10.09
Collections (List, Set, Queue, Map)  (0) 2020.10.05
String  (0) 2020.10.05
Late Binding  (0) 2020.10.04

+ Recent posts