자바의 멀티쓰레드 프로그래밍에 대해 학습하세요.
Thread
클래스를 상속Runnable
인터페이스 구현//Thread 클래스 상속
public class ThreadCreation extends Thread {
@Override
public void run(){
//작업 내용
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
ThreadCreation threadCreation = new ThreadCreation();
threadCreation.start();
}
}
/*
실행결과
main
Thread-0
*/
run()
외에도 오버라이드할 수 있는게 많다extends
이미 했기 때문에 확장성 아쉽//Runnable 인터페이스 구현
class ThreadCreation1 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
Runnable rannablThread = new ThreadCreation1();
Thread threadCreation = new Thread(rannablThread);
//위 두줄 한 줄로 하면
//Thread threadCreation = new Thrad(new rannablThread());
threadCreation.start();
}
}
//Runnable 익명 클래스
class ThreadCreation2 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();
}
}
//Runnable 람다
class ThreadCreation3 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
}
}
/*
실행결과
main
Thread-0
*/
run()
만 오버라이드 가능extends
가능start()
메서드로 쓰레드를 실행대기 상태로 만들며, 해당 쓰레드는 자기 차례가 되면 실행출저: 자바의 정석
getState()
메서드로 확인 가능하며, 리턴값은 Thread.State
EnumThread.State
은 가상 머신에서의 상태이며 OS 쓰레드 상태를 반영하지 않는다Enum Constant | 설명 |
---|---|
NEW | 쓰레드가 시작되지 않은 상태 |
RUNNABLE | JVM이 실행중인 상태(실행 대기 포함) |
BLOCKED | lock이 풀리기를 기다리는 상태 |
WAITING | 다른 쓰레드가 특정 작업을 수행할 때까지 무기한 대기 중인 상태 |
TIMED_WAITING | 다른 쓰레드가 작업하도록 지정한 시간 동안 대기 중인 상태 |
TERMINATED | 쓰레드가 종료된 상태 |
java.lang.Thread
는 실행제어를 위한 다양한 메서드 제공java.lang.Object
에도 wait()
notify()
등 쓰레드 실행제어 관련 메서드 제공priority
라는 멤버변수 값에 따라 결정java.lang.Thread
필드public static final int MAX_PRIORITY = 10
최대 우선순위 10public static final int MIN_PRIORITY = 1
최소 우선순위 10public static final int NORM_PRIORITY = 5
priority
의 범위는 1~10setPriority(int priority)
메서드 사용NORM_PRIORITY
로 5
이므로 자식 쓰레드도 기본값은 이와 같다synchronized
키워드를 이용한 동기화에 대해서만 살펴본다//메서드에 synchronized 키워드 사용
public synchronized void method(){
...
}
//블럭에 synchronized 키워드 사용
synchronized(lock_얻을_참조변수){
...
}
synchronized
사용하는 것보다 임계 영역 최소화해 성능 최적화 가능아래 4가지 조건이 모두 만족하면 교착 상태 발생