강의 메모 - Java Thread Fundamentals > 스레드 생성 #
개요 #
- 자바 스레드는 JVM에서 User Thread를 생성할때 시스템 콜을 통해서 커널에 생성된 Kernel Thread와 1:1 매핑이 되어 최종적으로 커널에서 관리된다.
- JVM에서 스레드를 생성할때마다 커널에서 자바 스레드와 대응하는 커널 스레드를 생성한다.
- 자바에서 Platform Thread으로 정의되어 있다. 즉, OS 플랫폼에 따라 JVM이 사용자 스레드를 매핑하게 된다.
- Platform Thread : 운영체제에서 스케줄링되는 Kernel 쓰레드와 1:1 매핑된 플랫폼 쓰레드의 생성을 지원한다.
- 사용자 수준 쓰레드처럼 쓰레드 관리, 스케줄링 등을 하지않고, 생성만 하고 커널 쓰레드와 매핑만 되어있음 (커널의 제어를 받는다.)
- Platform Thread : 운영체제에서 스케줄링되는 Kernel 쓰레드와 1:1 매핑된 플랫폼 쓰레드의 생성을 지원한다.
JVM에서 Platform Thread를 생성하고 (User 수준 쓰레드) 생성할때마다 Kernel Thread도 생성되고, 각각이 1:1로 매핑된다. Kernel Thread가 OS Scheduler에게 스케줄링 제어를 받는다. 1:1 매핑되기 때문에 Platform Thread도 스케줄링 제어를 받게된다. 스케줄링된 스레드는 CPU에 할당받아서 작업이 수행된다.
Thread API #
Thread 생성 #
2가지 방법이 있다.
- Thread 클래스를 상속하는 방법
- Runnable 인터페이스를 구현하는 방법
Thread 클래스를 상속하는 방법 #
작업 내용을 스레드 내부에 직접 재정의해서 실행된다.
Runnable 인터페이스를 구현하는 방법 #
작업 내용을 Runnable에 정의해서 스레드에 전달하면 스레드는 Runnable을 실행한다.
다양한 스레드 생성 패턴 #
- Thread를 상속한 클래스
public class ExtendThreadExample {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
class MyThread extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " :스레드 실행 중.. ");
}
}
Thread 익명 클래스
public class AnonymousThreadClassExample {
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " :스레드 실행 중..");
}
};
thread.start();
}
}
Runnable 구현
public class ImplementRunnableExample {
public static void main(String[] args) {
MyRunnable task = new MyRunnable();
Thread thread = new Thread(task);
thread.start();
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 스레드 실행 중");
}
}
Runnable 익명 클래스
public class AnonymousRunnableClassExample {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 스레드 실행 중..");
}
});
thread.start();
}
}
Runnable 람다 방식
public class LambdaThreadExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> System.out.println(Thread.currentThread().getName() + ": 스레드 실행 중.."));
thread.start();
}
}