
Java Programming for Complete Beginners - in28Minutes Official 강의중 정리내용입니다.
작업스레드도 객체로 생성되므로 클래스가 필요하다
Thread 클래스로부터 작업스레드 직접 생성
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
}
});
Thread thread = new Thread(() -> System.out.println("Working Thread"));
Thread 클래스를 상속하는 하위클래스로 구현, run() 메소드 오버라이드
public class SomethindDoingThread extends Thread {
@Override
public void run() {
...
}
// 추가 로직 작성 가능
public void doSomething(){
...
}
}스레드의 개수가 코어의 수보다 많을 경우 어떤 스레드에게 CPU 제어권을 주어야 하는지 결정해야 하는데, 이를 스레드 스케줄링이라고 한다. 스레드 스케줄링에 의해 스레드들은 아주 짧은 시간에 번갈아가면서 자신이 run() 메소드를 조금씩 실행한다.
자바의 스레드 스케줄링
setPriority(Integer) 메소드를 통해 구현할 수 있다.임계 영역 (Critical Section) : 멀티스레드 애플리케이션에서 하나의 스레드만 접근, 실행할 수 있는 코드영역을 임계영역이라고 한다.
자바에서 임계영역을 지정하기 위해 synchronized 메소드, 블록 기능을 제공한다
public synchronized void method() {
(임계 영역); // 단 하나의 스레드만 실행가능한 메소드
}
동기화 블록
일부 내용만 임계 영역을 만들고 싶다면 다음과 같이 동기화 블록을 만들 수 있다.
public voidmethod() {
// 여러 스레드가 실행 가능한 영역
...
synchronized(공유 객체) {
임계 영역// 단 하나의 스레드만 실행
}
// 여러 스레드가 실행 가능한 영역
...
}
Thread.State 에 정의되어 있으며, 스레드 객체로부터 getState 메소드를 통해 값을 얻을 수 있다.
public enum State {
/**
* A thread that has not yet started is in this state.
* 스레드 객체가 생성되었고, 아직 start() 메소드가 호출되지 않은 상태
*/
NEW,
/**
* A thread executing in the Java virtual machine is in this state.
* 실행 상태로 언제든지 갈 수 있는 상태
*/
RUNNABLE,
/**
* A thread that is blocked waiting for a monitor lock is in this state.
* 사용하고자 하는 객체의 lock이 풀릴 때까지 기다리는 상태
*/
BLOCKED,
/**
* A thread that is waiting indefinitely for another thread to perform a particular action is in this state.
* 다른 스레드가 통지할 때까지 기다리는 상태
*/
WAITING,
/**
* A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.
* 주어진 시간 동안 기다리는 상태
*/
TIMED_WAITING,
/**
* A thread that has exited is in this state.
* 실행을 마친 상태
*/
TERMINATED;
}
참조 블로그 : https://koey.tistory.com/262
| 메서드 | 설명 |
|---|---|
interrupt() | 일시 정지 상태의 스레드에서 interruptedException 예외를 발생시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 합니다. |
notify(), notifyAll() | 동기화 블록 내에서 wait() 메서드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만듭니다. |
resume() | suspend() 메서드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만듭니다.이 메서드는 Deprecated 메서드로 권하지 않기 때문에 대신 notiry(), notifyAll() 메서드를 사용합니다. |
sleep(long millis), sleep(long millis, int nanos) | 주어진 시간 동안 스레드를 일시 정지 상태로 만듭니다. 주어진 시간이 지나면 자동적으로 실행 대기 상태가 됩니다. |
join() , join(long millis), join(long millis, int nanos) | join() 메서드를 호출한 스레드는 일시 정지 상태가 됩니다. 실행 대기 상태로 가려면 join() 메서드를 멤버로 가지는 스레드가 종료되거나, 매개 값으로 주어진 시간이 지나야 합니다. |
wait() , wait(long millis), wait(long millis, int nanos) | 동기화(Synchronized) 블록 내에서 스레드를 일시 정지 상태로 만듭니다. 매개 값으로 주어진 시간이 지나면 자동적으로 실행 대기 상태가 됩니다. 시간이 주어지지 않으면 notify(), notifyAll() 메서드에 의해 실행 대기 상태로 갈 수 있습니다. |
suspend() | 스레드를 일시 정지 상태로 만듭니다. resume() 메서드를 호출하면 다시 실행 대기 상태가 됩니다.이 메서드는 Deprecated 메서드로 권하지 않기때문에 대신 wait() 메서드를 사용합니다. |
yield() | 실행 중에 우선순위가 동일한 다른 스레드에게 실행을 양보하고 실행 대기 상태가 됩니다. |
stop() | 스레드를 즉시 종료시킵니다.이 메서드는 Deprecated 메서드로 권하지 않습니다. |
스레드 풀은 작업 처리에 사용되는 스레드를 제한된 갯수만큼 정해놓고 작업 큐에 들어오는 작업들을 스레드가 하나씩 맡아 처리한다.

자바는 스레드 풀을 생성하고 사용할 수 있도록 java.util.concurrent 패키지에서
ExecutorService 인터페이스ExecutorService 의 구현 객체를 생성하는 Executors 클래스를 제공한다.병렬작업을 실행과 관련된 클래스 계층구조

Executor 인터페이스는 쓰레드 풀의 구현을 위한 인터페이스이다.
작업생성
작업은 Runnalble 또는 Callable 인터페이스를 구현하여 생성한다.
작업 완료후에 리턴값이 존재하지 않는다
Runnable task = new Runnable() {
@Override
public void run() {
// 스레드가 처리할 내용
}
}
작업 완료후에 리턴값이 존재한다
Callable<T> task = new Callable<T>() {
@Override
public T call() throws Exception {
// 스레드가 처리할 내용
return T;
}
}
작업 처리요청
ExecutorService의 작업 큐에 Runnable 또는 Callable 객체를 넣는 행위를 말한다.
작업 처리 요청을 위해 ExecutorService는 2가지 메소드를 제공한다.
voidFutureList<Future>을 반환함Future로 반환받음Callable 인터페이스의 구현체인 작업(Task)은 가용 가능한 쓰레드가 없어서 실행이 미뤄질 수 있고, 작업 시간이 오래 걸릴 수도 있다. 실행 결과를 바로 받지 못하고 미래의 어느 시점에 얻을 수 있는데, 미래에 완료된 Callable의 반환값을 구하기 위해 사용되는 것이 Future이다. 즉, Future는 비동기 작업을 갖고 있어 미래에 실행 결과를 얻도록 도와준다. 이를 위해 비동기 작업의 현재 상태를 확인하고, 기다리며, 결과를 얻는 방법 등을 제공한다.
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}