[JAVA] 스레드
스레드
- 프로세스
- 실행 중인 프로그램
- Java 프로그램은 하나의 프로세스로 만들어져 실행됨
- 실행 중인 프로그램
- 스레드
- 실행 중인 프로그램 내에 존재하는 소규모 실행 흐름
- 지금까지는 프로세스에서 하나의 스레드가 생성되고 main() 메소드가 호출되어 실행됨 (단일 스레드)
- 경량 프로세스
- 실행 중인 프로그램 내에 존재하는 소규모 실행 흐름
- 멀티 스레드
- Java 프로그램은 하나의 스레드(main 스레드)로 시작됨
- main 스레드에서 자식 스레드를 만들어 시작시킬 수 있음
- 여러 스레드가 동시에 독립적으로 실행되고 종료됨
- Java 프로그램은 하나의 스레드(main 스레드)로 시작됨
Thread 클래스
- 스레드의 생성과 관리를 위한 메소드를 제공
- 스레드 생성을 위해 Thread 유형의 객체가 필요함
- 생성자 : Thread(), Thread(String name), Thread(Runnable target), Thread(Runnable target, String name)
- Rannable 인터페이스를 구현하려면 run()을 구현해야 함
- Rannable 인터페이스를 구현하려면 run()을 구현해야 함
- 스레드 생성과 실행
- Thread 유형의 객체 t를 생성
- t.start()를 호출하면 스레드 실행이 시작됨
- 이것은 run() 메소드를 호출함
- 이것은 run() 메소드를 호출함
- void run() 메소드에 스레드의 실행 코드가 있음
- run()을 정의하는 두 가지 방법이 있음
- 즉, 스레드를 실행시키는 두가지 방법이 있음
- 즉, 스레드를 실행시키는 두가지 방법이 있음
- Thread 유형의 객체 t를 생성
스레드 실행방법 1 - Thread 클래스의 상속
- Thread 클래스를 상속받는 클래스 A를 정의
- 여기서 run() 메소드를 재정의
- 여기서 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 메소드를 구현
- 여기서 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");
}
}
스레드
- 프로세스
- 실행 중인 프로그램
- Java 프로그램은 하나의 프로세스로 만들어져 실행됨
- 스레드
- 실행 중인 프로그램 내에 존재하는 소규모 실행 흐름
- 지금까지는 프로세스에서 하나의 스레드가 생성되고 main() 메소드가 호출되어 실행됨 (단일 스레드)
- 경량 프로세스
- 멀티 스레드
- Java 프로그램은 하나의 스레드(main 스레드)로 시작됨
- main 스레드에서 자식 스레드를 만들어 시작시킬 수 있음
- 여러 스레드가 동시에 독립적으로 실행되고 종료됨
Thread 클래스
- 스레드의 생성과 관리를 위한 메소드를 제공
- 스레드 생성을 위해 Thread 유형의 객체가 필요함
- 생성자 : Thread(), Thread(String name), Thread(Runnable target), Thread(Runnable target, String name)
- Rannable 인터페이스를 구현하려면 run()을 구현해야 함
- 스레드 생성과 실행
- 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() 메소드가 종료된 상태 |
스레드의 상태 제어를 위한 메소드
- void setPriority(int newPriority)
- 스레드의 우선순위를 변경. 높은 우선순위를 가지는 스레드가 CPU를 얻을 확률이 높음
- 스레드의 우선순위를 변경. 높은 우선순위를 가지는 스레드가 CPU를 얻을 확률이 높음
- static void sleep(long millis) throws InterruptedException
- 현재 실행 중인 스레드가 정해진 시간 동안 실행을 멈추고 Not Running 상태로 들어감
- 현재 실행 중인 스레드가 정해진 시간 동안 실행을 멈추고 Not Running 상태로 들어감
- static void yield()
- 현재 실행중인 스레드가 잠시 실행을 멈추고 Runnable 상태로 들어감
- CPU를 다른 스레드에게 양보하는 것
- 현재 실행중인 스레드가 잠시 실행을 멈추고 Runnable 상태로 들어감
- void join() throws InterruptedException
- 스레드가 종료될 때까지 기다림
- 현재 실행 중이었던 스레드는 Not Running 상태로 들어감
- void join(long millis)는 최대 millis 시간 동안 기다림
- 기다리는 중에 다른 스레드가 이 스레드를 깨워주면 InterruptedException을 받으면서 리턴됨
- 스레드가 종료될 때까지 기다림
- void interrupt()
- 스레드를 인터럽트 시킴
- 스레드가 wait(), join(), sleep()에 의해 중단된 상태였다면 그 상태에서 깨어나 Runnable() 상태가 됨
- 스레드를 인터럽트 시킴
- void wait() throws InterruptedException
- void wait(long millis) throws InterruptedException
- 객체를 처리 중인 스레드를 정해진 시간 동안 중지시킴
- 다른 스레드가 해당 객체에 대해 notify() 메소드를 실행시켜 주면 이 스레드가 깨어날 수 있음
- 이 메소드는 synchronized 메소드의 내부에서만 호출 가능
- 객체를 처리 중인 스레드를 정해진 시간 동안 중지시킴
- void notify()
- wait()를 호출하여 중단된 스레드를 깨워줌
- 이 메소드는 synchronized 메소드의 내부에서만 호출 가능
- wait()를 호출하여 중단된 스레드를 깨워줌