キューオブジェクトで同期する3つのスレッドを開始するための次のコードがあります(構築時に渡されます)。各スレッドは、キューから読み取って操作を実行しようとします。
class smokers extends Thread{
final Queue q;
boolean smoked=false;
public smokers(Queue q,restype res){
this.q=q;
....
}
public void run(){
try{
while(smoked==false){
synchronized(q){
if (q.size()==0) wait();
...
q.poll();
notify();
}
}
}
}catch (InterruptedException intEx)
{
intEx.printStackTrace();
}
}
public static void main(String[] args){
final Queue q=new LinkedList();
....
while (q.size()<10){
q.add(....);
}
smokers[] smokers=new smokers[3];
smokers[0]=new smokers(q,restype.TOBACCO);
smokers[1]=new smokers(q,restype.PAPER);
smokers[2]=new smokers(q,restype.MATCH);
// Start the smokers
for (int i = 0; i < 3; i++) {
smokers[i].start();
}
// Wait for them to finish
for (int i = 0; i < 3; i++) {
try {
smokers[i].join();
} catch(InterruptedException ex) { }
}
// All done
System.out.println("Done");
}
}
私は次のようになります:
Exception in thread "Thread-2" Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at com.bac.threads.smokers.run(smokers.java:35)
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at com.bac.threads.smokers.run(smokers.java:35)
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at com.bac.threads.smokers.run(smokers.java:35)
私は何が間違っているのですか?