잘못 알기 쉬운 포인트들
1. 자바는 언제나 멀티 쓰레드 이다.
- main 쓰레드를 실행하면, 일반 쓰레드를 생성하지 않았더라도 GC 를 포함한 여러 쓰레드들이 백그라운드에서 돌고 있다.
2. 자바 프로그램이 종료되는 시점
- 모든 일반 쓰레드가 종료되어야 죽는다.
- main 쓰레드가 죽어도, 남아있는 일반 쓰레드가 있다면 프로그램이 종료되지 않는다.
System.exit();
를 하면 강제로 프로그램이 종료되어, 모든 쓰레드가 죽는다.
thread.setDaemon(true);
를 통해 설정한 데몬 쓰레드는, 모든 일반 쓰레드가 죽으면 같이 종료된다.
3. 객체에만 lock 을 걸 수 있다.
- primitive type 은 synchronized 를 하여도, race condition 이 발생한다.
- AtomicInteger 같은 클래스를 활용해보자.
4. thread.join()
- 상위 thread 흐름에, 현재의 쓰레드를 git merge 하듯이 병합시킨다.
- javascript 개발자라면, await 문법의 효과를 떠올리면 이해하기 쉬울 것 같다.
5. InterruptedException 은 반드시 try catch 로 잡아줘야한다.
- sleep 중인 쓰레드를 interrupt 하면 InterruptedException 이 발생한다.
- 절대로 다른 함수로 throw 하면 안된다.
6. Thread.sleep() 이 static 메서드인 이유
- Thread.sleep 코드를 실행하는 스레드 주체를 재우기 때문이다.