스레드

  1. 프로세스
    • 실행 중인 프로그램
    • Java 프로그램은 하나의 프로세스로 만들어져 실행됨

  2. 스레드
    • 실행 중인 프로그램 내에 존재하는 소규모 실행 흐름
    • 지금까지는 프로세스에서 하나의 스레드가 생성되고 main() 메소드가 호출되어 실행됨 (단일 스레드)
    • 경량 프로세스

  3. 멀티 스레드
    • Java 프로그램은 하나의 스레드(main 스레드)로 시작됨
    • main 스레드에서 자식 스레드를 만들어 시작시킬 수 있음
    • 여러 스레드가 동시에 독립적으로 실행되고 종료됨

Thread 클래스

  • 스레드의 생성과 관리를 위한 메소드를 제공
  • 스레드 생성을 위해 Thread 유형의 객체가 필요함
  • 생성자 : Thread(), Thread(String name), Thread(Runnable target), Thread(Runnable target, String name)
    • Rannable 인터페이스를 구현하려면 run()을 구현해야 함

  1. 스레드 생성과 실행
    • Thread 유형의 객체 t를 생성
    • t.start()를 호출하면 스레드 실행이 시작됨
      • 이것은 run() 메소드를 호출함
    • void run() 메소드에 스레드의 실행 코드가 있음
    • run()을 정의하는 두 가지 방법이 있음
      • 즉, 스레드를 실행시키는 두가지 방법이 있음

스레드 실행방법 1 - Thread 클래스의 상속

  • Thread 클래스를 상속받는 클래스 A를 정의
    • 여기서 run() 메소드를 재정의
  • A 유형의 객체를 생성하고 start()를 호출함

class MyThread1 extends Thread {
	public void run() {
		for(int i=0; i<10; i++) {
			System.out.println(getName());
		}
	}
}
public class ThreadTest1 {
	public static void main(String args[]){
		Thread t1 = new MyThread1();
		t1.start(); // start하면 스레드안의 run이 실행됨
		Thread t2 = new MyThread1();
		t2.start();
		System.out.println("main");
	}
}

스레드 실행방법 2 - Runnable 인터페이스를 구현

  • Runnable 인터페이스를 구현하는 클래스 B를 정의
    • 여기서 run 메소드를 구현
  • B의 객체를 인자로 사용하여 Thread 유형의 객체를 생성하고 start()를 호출함

class MyThread2 implements Runnable {
	public void run() {
		for(int i=0; i<10; i++) {
			System.out.println(Tread.currentThread().getName());
		}
	}
}
public class ThreadTest2 {
	public static void main(String args[]){
		Thread t1 = new Thread(new MyThread2(), "thd0");
		t1.start(); // start하면 스레드안의 run이 실행됨
		Thread t2 = new Thread(new MyThread2(), "thd1");
		t2.start();
		System.out.println("main");
	}
}

스레드

  1. 프로세스
    • 실행 중인 프로그램
    • Java 프로그램은 하나의 프로세스로 만들어져 실행됨
  2. 스레드
    • 실행 중인 프로그램 내에 존재하는 소규모 실행 흐름
    • 지금까지는 프로세스에서 하나의 스레드가 생성되고 main() 메소드가 호출되어 실행됨 (단일 스레드)
    • 경량 프로세스
  3. 멀티 스레드
    • Java 프로그램은 하나의 스레드(main 스레드)로 시작됨
    • main 스레드에서 자식 스레드를 만들어 시작시킬 수 있음
    • 여러 스레드가 동시에 독립적으로 실행되고 종료됨

Thread 클래스

  • 스레드의 생성과 관리를 위한 메소드를 제공
  • 스레드 생성을 위해 Thread 유형의 객체가 필요함
  • 생성자 : Thread(), Thread(String name), Thread(Runnable target), Thread(Runnable target, String name)
    • Rannable 인터페이스를 구현하려면 run()을 구현해야 함
  1. 스레드 생성과 실행
    • Thread 유형의 객체 t를 생성
    • t.start()를 호출하면 스레드 실행이 시작됨
      • 이것은 run() 메소드를 호출함
    • void run() 메소드에 스레드의 실행 코드가 있음
    • run()을 정의하는 두 가지 방법이 있음
      • 즉, 스레드를 실행시키는 두가지 방법이 있음

스레드 실행방법 1 - Thread 클래스의 상속

  • Thread 클래스를 상속받는 클래스 A를 정의
    • 여기서 run() 메소드를 재정의
  • A 유형의 객체를 생성하고 start()를 호출함
class MyThread1 extends Thread {
	public void run() {
		for(int i=0; i<10; i++) {
			System.out.println(getName());
		}
	}
}
public class ThreadTest1 {
	public static void main(String args[]){
		Thread t1 = new MyThread1();
		t1.start(); // start하면 스레드안의 run이 실행됨
		Thread t2 = new MyThread1();
		t2.start();
		System.out.println("main");
	}
}

스레드 실행방법 2 - Runnable 인터페이스를 구현

  • Runnable 인터페이스를 구현하는 클래스 B를 정의
    • 여기서 run 메소드를 구현
  • B의 객체를 인자로 사용하여 Thread 유형의 객체를 생성하고 start()를 호출함
class MyThread2 implements Runnable {
	public void run() {
		for(int i=0; i<10; i++) {
			System.out.println(Tread.currentThread().getName());
		}
	}
}
public class ThreadTest2 {
	public static void main(String args[]){
		Thread t1 = new Thread(new MyThread2(), "thd0");
		t1.start(); // start하면 스레드안의 run이 실행됨
		Thread t2 = new Thread(new MyThread2(), "thd1");
		t2.start();
		System.out.println("main");
	}
}

멀티 스레드의 실행

  • 멀티 스레드 프로그램의 실행 결과는 예측할 수 없음
    • 실행 결과가 매번 다를 수 있음
  • 각 스레드는 정해진 순서 없이 독립적으로 실행됨
  • main 스레드는 다른 스레드를 시작시키나 다른 스레드의 실행과 무관하게 실행되고 종료됨

스레드의 상태

  • 보통 1개의 CPU를 사용하여 여러 스레드가 수행됨
  • CPU를 얻어 실행되고 최종적으로 종료될 때까지 여러 상태 변화를 겪음

상태 설명
Startable 객체가 생성되었으나 start()의 실행 전
Runnable start() 메소드가 호출되었으나 CPU 획득 전
Running CPU를 얻어 실행 중
Not Running CPU를 잃고 중단된 상태. Blocked, Waiting, Timed_Waiting
Dead run() 메소드가 종료된 상태

스레드의 상태 제어를 위한 메소드

  1. void setPriority(int newPriority)
    • 스레드의 우선순위를 변경. 높은 우선순위를 가지는 스레드가 CPU를 얻을 확률이 높음
  2. static void sleep(long millis) throws InterruptedException
    • 현재 실행 중인 스레드가 정해진 시간 동안 실행을 멈추고 Not Running 상태로 들어감
  3. static void yield()
    • 현재 실행중인 스레드가 잠시 실행을 멈추고 Runnable 상태로 들어감
    • CPU를 다른 스레드에게 양보하는 것
  4. void join() throws InterruptedException
    • 스레드가 종료될 때까지 기다림
    • 현재 실행 중이었던 스레드는 Not Running 상태로 들어감
    • void join(long millis)는 최대 millis 시간 동안 기다림
    • 기다리는 중에 다른 스레드가 이 스레드를 깨워주면 InterruptedException을 받으면서 리턴됨
  5. void interrupt()
    • 스레드를 인터럽트 시킴
    • 스레드가 wait(), join(), sleep()에 의해 중단된 상태였다면 그 상태에서 깨어나 Runnable() 상태가 됨
  6. void wait() throws InterruptedException
  7. void wait(long millis) throws InterruptedException
    • 객체를 처리 중인 스레드를 정해진 시간 동안 중지시킴
    • 다른 스레드가 해당 객체에 대해 notify() 메소드를 실행시켜 주면 이 스레드가 깨어날 수 있음
    • 이 메소드는 synchronized 메소드의 내부에서만 호출 가능
  8. void notify()
    • wait()를 호출하여 중단된 스레드를 깨워줌
    • 이 메소드는 synchronized 메소드의 내부에서만 호출 가능

Updated: