007 Java Thread

강의 메모 - Java Thread Fundamentals > 스레드 생성 #

개요 #

  • 자바 스레드는 JVM에서 User Thread를 생성할때 시스템 콜을 통해서 커널에 생성된 Kernel Thread와 1:1 매핑이 되어 최종적으로 커널에서 관리된다.
  • JVM에서 스레드를 생성할때마다 커널에서 자바 스레드와 대응하는 커널 스레드를 생성한다.
  • 자바에서 Platform Thread으로 정의되어 있다. 즉, OS 플랫폼에 따라 JVM이 사용자 스레드를 매핑하게 된다.
    • Platform Thread : 운영체제에서 스케줄링되는 Kernel 쓰레드와 1:1 매핑된 플랫폼 쓰레드의 생성을 지원한다.
      • 사용자 수준 쓰레드처럼 쓰레드 관리, 스케줄링 등을 하지않고, 생성만 하고 커널 쓰레드와 매핑만 되어있음 (커널의 제어를 받는다.)

img.png

JVM에서 Platform Thread를 생성하고 (User 수준 쓰레드) 생성할때마다 Kernel Thread도 생성되고, 각각이 1:1로 매핑된다. Kernel Thread가 OS Scheduler에게 스케줄링 제어를 받는다. 1:1 매핑되기 때문에 Platform Thread도 스케줄링 제어를 받게된다. 스케줄링된 스레드는 CPU에 할당받아서 작업이 수행된다.

Thread API #

img_1.png

Thread 생성 #

2가지 방법이 있다.

  1. Thread 클래스를 상속하는 방법
  2. Runnable 인터페이스를 구현하는 방법

Thread 클래스를 상속하는 방법 #

img_2.png

작업 내용을 스레드 내부에 직접 재정의해서 실행된다.

Runnable 인터페이스를 구현하는 방법 #

img_3.png

작업 내용을 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();
    }
}