반응형
package multi_thread.thread_status;

public class ThreadA extends Thread{

	public boolean stop = false; // 종료 플래그
	public boolean work = true ; // 작업 진행 여부 플래그
	
	public void run() {
		while(!stop) {
			if(work) {
				System.out.println("ThreadA 작업 내용");
			} else {
				Thread.yield(); // 실행 대기 상태 만들기
			}
		}
		System.out.println("ThreadA 종료");
	}
}
package multi_thread.thread_status;

public class ThreadB extends Thread {
	
	public boolean stop = false; // 종료 플래그
	public boolean work = true ; // 작업 진행 여부 플래그
	
	public void run() {
		while(!stop) {
			if(work) {
				System.out.println("ThreadB 작업 내용");
			} else {
				Thread.yield(); // 실행 대기 상태 만들기
			}
		}
		System.out.println("ThreadB 종료");
	}
}
package multi_thread.thread_status;

public class YieldExample {

	public static void main(String[] args) {
		ThreadA threadA = new ThreadA();
		ThreadB threadB = new ThreadB();

		threadA.start();
		threadB.start();
		
		try {Thread.sleep(1000);} catch (InterruptedException e) {}
		threadA.work = false;
		
		try {Thread.sleep(1000);} catch (InterruptedException e) {}
		threadA.work = true;
		
		try {Thread.sleep(1000);} catch (InterruptedException e) {}
		threadA.stop = true; 
		threadB.stop = true;
		// thread.stop() 이라는 메소드가 존재하지만 강제로 종료하는 거이기 때문에 스레드가 살아있을 수가 있기 때문에 플래그값을 변경해 스레드 자체를 정상 종료시키는게 더 좋은 방법
		}
	}

yield() 메소드호출한 스레드를 실행 대기 상태로 돌아가 다른 스레드가 실행 기회를 가질 수 있게 도와줍니다.

(동일 또는 높은 우선순위의 스레드)

 

여기에서 ThreadA, B가 번갈아가면서 사용하지만 ThreadA의 work 값이 false가 되면 아무 이유 없는 무한루프를 반복합니다.

 

멀티스레드가 정말 병렬처리라면 상관 없는데 번갈아가면서 사용하는 거기 때문에(싱글코어 일시 = CPU1개) Thread A가 의미 없는 짓을 할 때 동안 ThreadB는 사용을 못하게 되는 것이죠 그걸 yield()메소드를 이용해 ThreadB가 계속적으로 사용될 수 있게  ThreadB가 의미 없는짓 할 땐 ThreadA가 쓰게 되면 번갈아 가면서 안 써도 되니까 속도가 더 빨라지겠죠?

 

 

반응형