Runnable인터페이스

반환값이 없는 run 메서드를 갖고있는 무언가를 실행하기 위한 내용을 담은 녀석

Thread 서브클래싱과 Runnable 인터페이스를 구현하는 것 중에서 무엇이 더 선호할 이유는 없지만, Thread 인스턴스 메서드가 유용할 경우 서브클래싱을 해야함

Future, Callable, Excutor

자바5에서는 멀티스레드의 복잡한 내용을 감추고 콜백을 좀 더 쉽게 사용할 수 있도록 새로운 접근 방법을 제공함. 스레드를 직접 생성하지 않고 ExecutorService를 사용하여 스레드 생성에 대한 내용을 감춘다.

작업 대상의 Callable 객체를 만들고 이를 ExecutorService에 등록한 다음 Future 객체를 반환받는다.

나중에 작업에 대한 결과를 Future를 통해 얻는다.

스레드 스케쥴링

다수의 스레드가 동시에 실행될 수 있다면 스레드 스케쥴링에 대해 고민을 해야한다.

중요한 스레드의 경우, 실행에 필요한 최소한의 시간이 보장되어야하고, 더 중요한 스레드의 경우 더 많은 시간을 필요로 한다. JVM은 I/O 동작을 위해 기다리지 않고 다른 스레드를 실행시킬 수 있다. 그러나 CPU 자원을 많이 사용하는 프로그램의 경우 이러한 전략을 사용하기는 어렵다.

최악의 경우 스레드 하나가 모든 CPU 독점하여 다른 스레드들을 기아 상태로 만들어 버리는 상황이 발생할 수도 있다.

우선순위

스레드에 우선순위를 부여하여 스레드마다 할당되는 CPU 시간을 달리 줄수 있음.

선점

JVM은 특정 시점에 실행될 스레드를 결정하는 스레드 스케쥴러를 제공한다. 스레드 스케쥴러는 선점형(preemptive)와 협력형(cooperative) 두가지가 있다.

협력형 스케쥴러의 경우 선점형보다 CPU 기아 상태를 더 일으키기 쉽다. 다음은 스레드가 다른 스레드를 위해 실행을 중지하거나 실행을 중지할 준비가 되었음을 JVM에게 알려주는 방법이다.