쓰레드의 상태
NEW : 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE : 실행 중 실행 가능한 상태
BLOCKED : 동기화 블럭에 의해서 일시정지된 상태
WAITING, TIMED_WAITING : 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일시정지상태
: TIMED_WATING은 일시정지시간이 지정된 경우를 의미한다.
TERMINATED : 쓰레드의 작업이 종료된 상태
쓰레드 상태의 검사 대상이 되는 쓰레드를 작성한다.
class TargetThread extends Thread{
@Override
public void run() {
for(long i = 1L; i <= 20_000_000_000L; i++) { } // 시간 지연용
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO: handle exception
}
for(long i = 1L; i <= 20_000_000_000L; i++) { } // 시간 지연용
}
}
검사 대상의 쓰레드의 상태를 검사하여 출력하는 쓰레드를 작성한다.
class StatePrintThread extends Thread{
private TargetThread target; // 검사 대상의 쓰레드가 저장될 변수
// 생성자
public StatePrintThread(TargetThread target) {
this.target = target;
}
@Override
public void run() {
while(true) {
// 쓰레드의 현재 상태 구하기 ==> getState()메서드 이용
Thread.State state = target.getState();
System.out.println("TargetThread의 현재 상태값 : " + state);
if(state == Thread.State.NEW) { // 쓰레드의 현재 상태가 NEW 상태이면...
target.start(); // 쓰레드 작동
}
if(state == Thread.State.TERMINATED) { // 쓰레드가 종료 상태이면...
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}
}
메인에서 쓰레드를 출력해본다.
public class ThreadTest11 {
public static void main(String[] args) {
Thread th = new StatePrintThread(new TargetThread());
th.start();
}
}
처음엔 NEW였다가 진행중에는 RUNNABLE이 되고 sleep을 만나 TIMED_WAITING이 되고
마지막에 TERMINATED가 되는 것을 알 수 있다.
원주율을 구하는 쓰레드를 작성해 봅니다.
원주율을 계산하는 쓰레드와 계산된 원주율을 출력하는 쓰레드가 있다.
원주율을 저장하는 객체가 필요하다. 이 객체를 두 쓰레드에서 공통으로 사용해서 처리한다.
public class ThreadTest14 {
public static void main(String[] args) {
// 공통으로 사용할 객체 생성
ShareData sd = new ShareData();
// 쓰레드 객체를 생성하고 공통으로 사용할 객체를 쓰레드에 주입한다.
CalcPIThread calc = new CalcPIThread(); //세터를 이용해서
calc.setSd(sd);
PrintPIThread print = new PrintPIThread(sd); // 생성자를 이용해서
calc.start();
print.start();
}
}
// 원주율을 관리하는 클래스(공통으로 사용할 클래스)
class ShareData{
public double result; //계산된 원주율이 저장될 변수
public volatile boolean isOk = false; // 계산이 완료되었는지를 나타내는 변수
}
// 계산이 완료되면 계산된 원주율을 출력하는 쓰레드
class PrintPIThread extends Thread{
private ShareData sd; // 공통으로 사용할 객체의 참조값이 저장될 변수 선언
public PrintPIThread(ShareData sd) {
this.sd = sd;
}
@Override
public void run() {
while(true) {
if(sd.isOk == true) {
break;
}
}
System.out.println();
System.out.println("결과 : " + sd.result);
System.out.println("P I : " + Math.PI);
}
}
// 원주율을 계산하는 쓰레드
class CalcPIThread extends Thread{
private ShareData sd;
// setter를 이용해서 공통으로 사용할 객체 주입
public void setSd(ShareData sd) {
this.sd= sd;
}
@Override
public void run() {
/*
원주율 = (1/1 - 1/3 + 1/5 - 1/7 + 1/9 - ...) * 4;
1 - 3 + 5 - 7 + 9 ...
0 1 2 3 4
*/
double sum = 0.0;
for(int i = 1; i <2_000_000_000; i+=2) {
if( (i / 2) % 2 == 0 ) { // 2로 나눈 몫이 짝수일 경우
sum += (1.0 / i);
}else {
sum -= (1.0 / i);
}
}
sd.result = sum * 4; // 계산 완료
sd.isOk = true;
}
}
고급 자바_0102_1 (1) | 2023.01.02 |
---|---|
고급 자바_1229-1 (0) | 2022.12.29 |
고급 자바_1227-1 (2) | 2022.12.27 |
고급자바_1223-1 (0) | 2022.12.23 |
고급자바_1222-2 (2) | 2022.12.22 |