HappyWeasel
Java - 멀티 스레드 (Multi Thread)의 개요 및 구현 본문
https://palpit.tistory.com/729
Thread 개요
Runnable 상태 : 쓰레드가 실행되기위한 준비 단계
Running 상태 : 스케줄러에 의해 선택된 쓰레드가 실행되는 단계
Blocked 상태 : 쓰레드가 작업을 완수하지 못하고 잠시 작업을 멈추는 단계
스레드의 생명 주기
1. Runnable (준비상태)
스레드가 실행되기 위한 준비단계입니다. CPU를 점유하고 있지않으며 실행(Running 상태)을 하기 위해 대기하고 있는 상태입니다. 코딩 상에서 start( ) 메소드를 호출하면 run( ) 메소드에 설정된 스레드가 Runnable 상태로 진입합니다. “Ready“ 상태라고도 합니다.
2. Running (실행상태)
CPU를 점유하여 실행하고 있는 상태이며 run() 메서드는 JVM만이 호출 가능합니다. Runnable(준비상태)에 있는 여러 스레드 중 우선 순위를 가진 스레드가 결정되면 JVM이 자동으로 run( ) 메소드를 호출하여 스레드가 Running 상태로 진입합니다.
3. Dead (종료상태)
Running 상태에서 스레드가 모두 실행되고 난 후 완료 상태입니다. “Done” 상태라고도 한다.
4. Blocked (지연 상태)
CPU를 점유권을 상실한 상태입니다. 후에 특정 메서드를 실행시켜 Runnable(준비상태)로 전환합니다.
wait( ) 메소드에 의해 Blocked 상태가 된 스레드는 notify( ) 메소드가 호출되면 Runnable 상태로 간다.
sleep(시간) 메소드에 의해 Blocked 상태가 된 스레드는 지정된 시간이 지나면 Runnable 상태로 간다.
Thread의 구현과 실행.
1. Thread 클래스를 상속
class MyThread extends Thread{
public void run() { /* 작업내용 */ } // Thread클래스의 run()을 오버라이딩
}
2. Runnable interface를 구현 (다른 클래스를 상속 받기 위해서 더 많이 쓰인다.)
class MyThread implements Runnable{
public void run(){ /* 작업내용 */ } //Runnable 인터페이스의 추상메서드 run()을 구현
}
//-----------------------------------------------------------------------------------
public interface Runnable{
public abstract void run();
}
1. Thread 클래스 상속
// 1. Thread를 상속 받아서 구현.
public class excute extends Thread{
// 생성자
public excute(String name) {
super(name); // 부모클래스(Thread)의 생성자 호출
}
@Override
public void run() {
for(int i=1; i<=5;i++) {
// 현재 실행 중인 Thread 이름을 출력.
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(1000); // Thread를 1초간 멈춤.
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
excute e1 = new excute("Thread1");
excute e2 = new excute("Thread2");
excute e3 = new excute("Thread3");
// Thread객체.start() ==> run() method가 실행.
e1.start();
e2.start();
e3.start();
// run()을 호출하면 메인 스레드가 실행 됨.
}
}
생성자를 이용하지 않고 Thread 이름을 설정.
// 1. Thread를 상속 받아서 구현.
public class excute extends Thread{
// 생성자
/*
* public excute(String name) { super(name); // 부모클래스(Thread)의 생성자 호출 }
*/
@Override
public void run() {
for(int i=1; i<=5;i++) {
// 현재 실행 중인 Thread 이름을 출력.
System.out.println(
Thread.currentThread().getName());
try {
Thread.sleep(1000); // Thread를 1초간 멈춤.
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// excute e1 = new excute("Thread1");
// excute e2 = new excute("Thread2");
// excute e3 = new excute("Thread3");
// 생성자를 이용하지 않고 이름을 설정할 수 있다.
excute e1 = new excute();
excute e2 = new excute();
excute e3 = new excute();
e1.setName("Thread 1");
e2.setName("Thread 2");
e3.setName("Thread 3");
// Thread객체.start() ==> run() method가 실행.
e1.start();
e2.start();
e3.start();
// run()을 호출하면 메인 스레드가 실행 됨.
}
}
2. Runnable interface를 이용하여 Thread 구현.
// 2. Runnable interface를 이용하여 Thread 구현.
// run() Method를 반드시 구현해야함.
public class excute implements Runnable{
@Override
public void run() {
for(int i=1; i<=5;i++) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
excute e1 = new excute();
Thread t1 = new Thread(e1, "Thread 1"); // Thread 구현 객체, Thread 이름 선언
Thread t2 = new Thread(e1, "Thread 2");
t1.start(); // Thread 시작을 요청 => run Method가 실행 됨.
t2.start();
}
}
'Basic > Java' 카테고리의 다른 글
Java - Spring 설치하기 (0) | 2019.04.23 |
---|---|
Java - Thread 정리 (0) | 2019.04.22 |
Java - ArrayList, LinkedList (0) | 2019.04.20 |
Java - 스택( Stack ), 큐 ( Queue ) (0) | 2019.04.20 |
Java - 제너릭 (Generic) (0) | 2019.04.20 |