- 일반적으로 자바 애플리케이션을 실행하면 1개의 main쓰레드에 의해 프로그램이 실행된다.
- 하지만 1개의 쓰레드 만으론 동시에 여러 작업을 할 수 없고, 자바는 멀티 쓰레드 기반으로 동시성 프로그래밍을 지원하기 위한 방법들을 계속해서 발전시켜 왔다.
- Thread와 Runnable은 자바 초기부터 멀티 쓰레드를 위해 제공된 기술이다.
Thread 클래스
- 쓰레드 생성을 위해 자바에서 미리 구현해둔 클래스이다.
- 다음과 같은 메서드들을 제공한다.
- sleep()
- 현재 쓰레드 멈추기
- intrupt()
- 다른 쓰레드를 깨워 interruptedException를 발생시킴
- interupt가 발생한 쓰레드는 예외를 catch하여 다른 작업을 할 수 있다.
- join()
- 다른 쓰레드의 작업이 끝날 때까지 기다리게 한다.
- 쓰레드의 순서 제어 시 사용
- Thread의 start 메서드를 호출하면 run 메서드가 실행된다.
- thread.start() 시
- 쓰레드가 실행 가능한 지 검사
- 쓰레드를 쓰레드 그룹에 추가
- 쓰레드를 JVM이 실행시킴
- 쓰레드를 JVM에서 실행시킬 때, JVM 내부에서 run을 호찰하고, 쓰레드의 상태 역시 Runnable로 바뀌게 된다.
Runnable 인터페이스
- Runnable 인터페이스는 1개의 메서드만을 갖는 함수형 인터페이스이다.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
- 쓰레드를 구현하기 위한 템플릿에 해당한다.
- 해당 인터페이스의 구현체를 만든 후, Thread 객체 생성 시 넘겨주면 Thread 실행이 가능하다.
- Runnable은 익명 객체 및 람다로 사용할 수 있다.
Runnable userA = () -> {
fieldService.logic("userA");
};
// 다음 코드와 동일함
Runnable userA = new Runnable() {
@Override
public void run() {
fieldService.logic("userA");
}
};
Thread threadA = new Thread(userA);
threadA.setName("thread-A");
threadA.start();
Share article