스레드 상태
- 실행 대기 상태: 실행을 기다리고 있는 상태
- 실행 상태: CPU 스케쥴링에 따라 CPU를 점유하고 run() 메소드를 실행. 스케줄링에 의해 다시 실행 대기 상태로 돌아갔다가 다른 스레드가 실행 상태 반복
- 종료 상태: 실행 상태에서 run() 메소드가 종료되어 실행할 코드 없이 스레드의 실행을 멈춘 상태
출처, 이것이 자바다
일지 정지 상태
- 스레드가 실행할 수 없는 상태
- 스레드가 다시 실행 상태로 가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야야 함
출처, 이것이 자바다
주어진 시간 동안 일시 정지
- Thread 클래스의 sleep() 메소드: 실행 중인 스레드를 일정 시간 멈추게 함
- 매개값 단위는 밀리세컨드(1/1000)
출처, 이것이 자바다
package ch14.sec05.exam01;
/*
스레드 상태 : 일시정지
*/
import java.awt.Toolkit;
public class SleepExample {
//메인 스레드 : 10번 3초마다 일시정지.
public static void main(String[] args) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<10; i++) {
toolkit.beep();
System.out.println("띵");
//3초마다 일시정지
try { Thread.sleep(3000); } catch (Exception e) {}
}
}
}
다른 스레드의 종료를 기다림
- 스레드는 다른 스레드와 독립적으로 실행하지만 다른 스레드가 종료될 때까지 기다렸다가 실행을 해야 하는 경우가 있다.
- 예) 계산 스레드의 작업이 종료된 후 그 결과값을 받아 처리하는 경우
package ch14.sec05.exam02;
//스레드 클래스를 상속하여, 자식 클래스로 스레드 작업
public class SumThread extends Thread {
private long sum;
public long getSum() {
return sum;
}
//1 ~ 100 까지의 합
@Override
public void run() {
for(int i=1; i<=100; i++) {
sum += i;
}
}
}
package ch14.sec05.exam02;
/*
스레드 : 일시정지(join) 다른 스레드의 종료를 기다렸다가 진행을 하고자 할때 사용.
-메인 스레드, 작업자 스레드
*/
public class JoinExample {
public static void main(String[] args) {
SumThread sumThread = new SumThread(); //스레드상태 : New
sumThread.start(); //스레드상태 : Runnable(실행대기)
try {
//메인스레드는 일시정지가되고, sumThread 스레드가 종료될 때 메인 스레드는 실행대기상태가 된다.
sumThread.join(); //sumThread 스레드의 종료를 기다리는 목적.(sumThread 스레드의 작업결과를 사용)
} catch (InterruptedException e) {}
System.out.println("1 ~ 100 합: " + sumThread.getSum());
}
}
다른 스레드에게 실행 양보
- yield() 메소드: 실행되는 스레드는 실행 대기 상태로 돌아가고, 다른 스레드가 실행되도록 양보
- 무의미한 반복을 막아 프로그램 성능 향상
출처, 이것이 자바다
출처, 이것이 자바다
package ch14.sec05.exam03;
/*
스레드 상태 : 일시정지(yield)
CPU의 점유를 받은 스레드가 할 일이 없는 상황이 발생되었을 때
즉, CPU의 자원이 낭비가 되는 상황을 막고, 실행대기상태의 다른 스레드에게 기회를 주고자 한다.
*/
public class WorkThread extends Thread {
//필드
public boolean work = true;
//생성자
public WorkThread(String name) {
setName(name); //스레드 이름변경.
}
//메소드
@Override
public void run() {
//main스레드와는 별개로 독립적으로 실행되는 코드
while(true) {
if(work) {
//실제작업
System.out.println(getName() + ": 작업처리");
}else {
Thread.yield(); //현재 실행중인 스레드는 일시정지가 된다.
}
}
}
}
package ch14.sec05.exam03;
/*
스레드 : 메인 스레드, workThreadA스레드,workThreadB스레드
실행(스레드) : cpu가 일정 할당된 시간만큼만 run()메소드의 코드를 실행한다.
스레드를 runnable(실행대기) 상태로 돌려보낸다.
*/
public class YieldExample {
public static void main(String[] args) {
WorkThread workThreadA = new WorkThread("WorkThreadA");
WorkThread workThreadB = new WorkThread("WorkThreadB");
workThreadA.start(); //Runnable 상태
workThreadB.start();
//메인 스레드 5초 일시정지.
try { Thread.sleep(5000); } catch (InterruptedException e) {}
workThreadA.work = false;
//메인 스레드 10초 일시정지.
try { Thread.sleep(10000); } catch (InterruptedException e) {}
workThreadA.work = true;
}
}
'라이브러리 활용 - 멀티 스레드' 카테고리의 다른 글
스레드 안전 종료 (1) | 2023.02.06 |
---|---|
스레드 동기화 (0) | 2023.02.03 |
스레드 이름 (0) | 2023.02.03 |
작업 스레드 생성과 실행 (1) | 2023.02.03 |
메인 스레드 (0) | 2023.02.03 |