0

キューオブジェクトで同期する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)

私は何が間違っているのですか?

4

2 に答える 2

3

を呼び出しますnotifythis、フィールドで同期しますqwait通話 についても同じです。

于 2012-10-10T10:05:42.797 に答える
2

ロックしたオブジェクトとは別のオブジェクトでnotify()を呼び出しています。

notify();

と同じです

this.notify();

あなたが意図したとき

q.notify();

ところで:私は高レベルの同時実行ライブラリを見ていきます

于 2012-10-10T10:05:05.427 に答える