상세 컨텐츠

본문 제목

고급 자바_1227-2

자바

by 정재화니 2022. 12. 27. 12:30

본문

쓰레드의 상태

 

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

관련글 더보기