스레드(Thread)
멀티 스레드(Multi-Thread)
Thread 생성과 실행
Thread 클래스로부터 직접 생성
public class threadCreateMethod {
public static void main(String[] args) throws InterruptedException {
// Runnable 구현한 객체 생성,
Runnable task = new Task();
// Runnable 객체를 매개로 해서 thread 생성
Thread thread = new Thread(task);
// Runnable 익명 객체를 매개변수로 사용할 수 있습니다.
Thread anonymousThread = new Thread(new Runnable() {
public void run() {
System.out.println("Run in AnonymousThread");
}
});
thread.start(); // 스레드 시작
anonymousThread.start();
for (int i=0; i<100; i++){
Thread.sleep(250);
System.out.println("Run in MainThread");
}
}
}
class Task implements Runnable {
public void run() {
for (int i=0; i<100; i++){
try {
Thread.sleep(250);;
} catch (InterruptedException e) {}
System.out.println("Run in Thread");
}
}
}
// 출력값이 마구잡이로 나옴
Thread 하위 클래스로부터 생성
class WorkerThread extends Thread {
@Override
public void run() {
// 실행할 코드 ....
}
}
public class threadCreateMethod {
public static void main(String[] args) {
Thread thread = new WorkerThread();
thread.start();
}
}
스레드의 이름 (추가 필요)
thread.setName("스레드 이름"); // 스레드 이름 설정
thread.getName(); // 스레드 이름 가져오기
Thread thread = Thread.currentThread();
동기화 메서드와 동기화 블록
멀티 스레드 프로그램에서는 스레드들이 객체를 공유해서 작업해야 하는 경우, 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 하려면 스레드 작업이 끝날 때까지 객체에 잠금을 걸어서 다른 스레드가 사용할 수 없도록 해야한다.
임계 영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역
동기화 메서드를 만드는 방법
스레드의 상태
start() 메서드를 호출시
메서드 실행시
메서드 실행 (일부 경우)
스레드의 상태 종류
상태 | 열거 상수 | 설명 |
---|---|---|
객체 생성 | NEW | 스레드 객체 생성, 아직 start() 메서드가 호출되지 않은 상태 |
실행 대기 | RUNNABLE | 실행 상태로 언제든지 갈 수 있는 상태 |
일시정지 | BLOCKED | 사용하고자 하는 객체의 락이 풀릴때까지 기다리는 상태 |
일시정지 | WAITING | 다른 스레드가 통지할 때까지 기다리는 상태 |
일시정지 | TIMED_WAITING | 주어진 시간동안 기다리는 상태 -> sleep(시간) |
종료 | TERMINATED | 실행을 마친 상태 |