Java 스레드 제어: yield, join, 중단 및 생명주기

스레드 양보 (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;
            }
        }
    }
}

태그: Java 스레드 Thread.yield Thread.join 스레드 중단 스레드 생명주기

7월 13일 20:05에 게시됨