스레드 양보 (Thread.yield())
Thread.yield() 메소드는 정적 메소드로, 호출된 스레드가 CPU 자원을 양보하도록 합니다.
중요: 양보는 현재 스레드가 CPU 자원에서 빠져나와 준비 상태로 전환되며, 이후 다시 자원을 획득할 수 있습니다.
예시: 두 개의 스레드 A, B를 각각 1-100까지 출력하는 코드를 작성하되, B 스레드는 매 출력 후 양보하는 방식으로 구현
public class ThreadYieldDemo {
public static void main(String[] args) {
ThreadA a = new ThreadA();
ThreadB b = new ThreadB();
a.start();
b.start();
}
}
public class ThreadA extends Thread {
@Override
public void run() {
for (int count = 1; count <= 100; count++) {
System.out.println("스레드 A: " + count);
}
}
}
public class ThreadB extends Thread {
@Override
public void run() {
for (int count = 1; count <= 100; count++) {
System.out.println("스레드 B: " + count);
// 현재 스레드가 CPU 자원을 양보
Thread.yield();
}
}
}
스레드 결합 (Thread.join())
thread.join() 메소드는 현재 스레드를 지정된 스레드가 완료될 때까지 대기시킵니다.
예: 메인 스레드와 작업 스레드가 각각 200회 출력하되, 메인 스레드가 10번 출력 후 작업 스레드가 먼저 완료되도록 구현
public class ThreadJoinDemo {
public static void main(String[] args) throws InterruptedException {
WorkerThread worker = new WorkerThread();
worker.start();
for (int i = 1; i <= 200; i++) {
System.out.println("메인 스레드: " + i);
if(i == 10) {
// 작업 스레드를 현재 스레드에 결합
worker.join();
}
}
}
}
public class WorkerThread extends Thread {
@Override
public void run() {
for (int i = 1; i <= 200; i++) {
System.out.println("작업 스레드: " + i);
}
}
}
스레드 중단
12.1 스레드 중단 방법 1
질문: 다음 코드에서 작업 스레드는 3000ms 후에 종료되는가? 답변: 항상 그렇지는 않습니다. 3000ms 후 메인 스레드가 깨어나고 CPU 자원을 획득해야 합니다. 즉시 CPU를 획득하면 3000ms 후에 스레드가 종료되지만, CPU를 획득하지 못하면 메인 스레드가 CPU를 획득할 때까지 계속 실행됩니다.
public class ThreadInterruptionDemo {
public static void main(String[] args) throws InterruptedException {
TaskThread t = new TaskThread();
t.start();
// 메인 스레드 3초 대기
Thread.sleep(3000);
// 더 이상 사용되지 않는 메소드
t.stop(); // 즉시 중단 (단점: 기능 손실 가능성)
}
}
public class TaskThread extends Thread {
@Override
public void run() {
while (true) {
// 스레드 실행 로직
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 스레드 중단 처리
break;
}
}
}
}