* 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 |