package CHAPTER12;

class YieldThread extends Thread {
	private final int delayMs;

	public YieldThread(String name, int delayMs) {
		super(name); // 스레드 이름 지정
		this.delayMs = delayMs;
	}

	@Override
	public void run() {
		for (int i = 1; i <= 5; i++) {
			System.out.println(getName() + " 실행: " + i);

			// 특정 시점에 CPU 양보 시도
			if (i == 3) {
				System.out.println(" -> " + getName() + " : yield 호출");

				Thread.yield();
			}

			try {
				Thread.sleep(delayMs); // 밀리초 단위
			} catch (InterruptedException e) {
				System.out.println(getName() + " : 인터럽트 발생");
				// 인터럽트 플래그 복구(선택): Thread.currentThread().interrupt();
				break;
			}
		}
		System.out.println(getName() + " 종료");
	}
}

public class YieldTest {
	public static void main(String[] args) {
		YieldThread t1 = new YieldThread("A", 120);
		YieldThread t2 = new YieldThread("B", 100);

		// 스레드 실행 시작
		t1.start();
		t2.start();

		// main 스레드는 두 작업 스레드가 끝날 때까지 대기(join)
		try {
			System.out.println("[main] A와 B가 끝날 때까지 대기(join) 시작");
			t1.join(); // A 종료 대기
			t2.join(); // B 종료 대기
			System.out.println("[main] A와 B 종료 확인");
		} catch (InterruptedException e) {
			System.out.println("[main] join 대기 중 인터럽트 발생");
			// Thread.currentThread().interrupt(); // 필요 시 복구
		}

		System.out.println("[main] 프로그램 종료");
	}
}

////Thread.yield()를 테스트할 사용자 정의 스레드
//class YieldThread extends Thread {
//	public YieldThread(String name) {
//		super(name); // 스레드 이름 지정
//	}
//
//	public void run() {
//		for (int i = 1; i <= 5; i++) {
//			System.out.println(getName() + " 실행: " + i);
//
//			if (i == 3) {
//				// 현재 스레드가 실행을 양보하려고 요청
//				Thread.yield(); // 다른 스레드에게 실행 기회를 양보함
//			}
//		}
//	}
//}
//
//public class C13_04_YieldTest { // yield() 메서드 테스트 예제
//	public static void main(String[] args) {
//		// 두 개의 스레드 생성
//		YieldThread t1 = new YieldThread("A");
//		YieldThread t2 = new YieldThread("B");
//
//		// 스레드 실행 시작
//		t1.start();
//		t2.start();
//	}
//}

