특히,이 코드 조각에 어떤 문제가 있는지 말해 줄 수 있습니까? 스레드를 시작해야하므로 "Entering thread .."를 5 번 인쇄 한 다음 notifyAll()이 호출 될 때까지 기다려야합니다. 하지만, 그것은 "Entering .."과 "Done .."을 무작위로 인쇄하고 다른 사람들을 기다리고 있습니다.여러 스레드에서 wait 및 notify 프로토콜을 사용하는 방법
public class ThreadTest implements Runnable {
private int num;
private static Object obj = new Object();
ThreadTest(int n) {
num=n;
}
@Override
public void run() {
synchronized (obj) {
try {
System.out.println("Entering thread "+num);
obj.wait();
System.out.println("Done Thread "+num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Runnable tc;
Thread t;
for(int i=0;i<5;i++) {
tc = new ThreadTest(i);
t = new Thread(tc);
t.start();
}
synchronized (obj) {
obj.notifyAll();
}
}
}
감사합니다. 나는 여기에 간단한 해결 방법은 모든 스레드가 자신의 wait() 상태가되었는지 확인하기 위해 notifyAll() 전에 Thread.sleep (1000)을 넣는 것입니다. – figaro
잘 작동 할 수도 있지만 순진한 해결책입니다. 대기 호출 전에 더 많은 작업을 수행하려는 경우 가능한 한 빨리 작업자 스레드를 해제해야하거나 작업자 스레드가 예상보다 오래 걸리는 경우에도 동일한 문제가 발생합니다. 잠금을 사용해야합니다. 그것이 바로 동시 프로그래밍이 전부입니다. David Blevin의 코드를 살펴보십시오. 이는 카운트 다운 잠금을 사용하는 좋은 예입니다. – Scott