0

コードスニペット:

class Counter implements Runnable {
    Object s = new Object();

    @Override
    public void run() {
        try {
            synchronized (s) {
                s.wait(10000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //...do Something
    }

    public void stopCounter() {
        synchronized (s) {
            s.notifyAll();
        }   
    }
}

stopCounter を呼び出すかどうかに関係なく、...do Something コードは常に待機間隔の後にのみ実行されます。通知後も 10 秒間待機します。

4

3 に答える 3

1

あなたの例から、あなたが何を達成しようとしているのかわかりません。ある種のポーリングを置き換えようとする場合は、Java 5でリリースされたBlockingQueueインターフェースを検討してください。それが表示されてから、待機/通知する必要はありませんでした。使用ははるかに簡単で、舞台裏のJavaは待機/通知と同等の機能を果たします。

于 2012-09-04T12:19:09.360 に答える
0

使い方次第ですね。メインメソッドを追加して実行してみましたが、説明した方法ではなく、待機/通知メカニズムが正常に機能しているようです。自分で試してみてください:

public static void main(String[] args) {
  Counter c = new Counter();
  new Thread(c).start();
  try {
    Thread.sleep(1000);
  } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  c.stopCounter();
}
于 2012-09-04T12:16:14.513 に答える
0

私の推測では、クラスの異なるインスタンスでrunandメソッドを呼び出していると思います。したがって、それらは異なるモニター (あなたの) を使用し、停止の呼び出しは他のカウンターに通知しません。stopCounterCounters = new Object()

たとえば、これはあなたが説明したものと同様に動作します(偽のウェイクアップが発生しない限り):

public static void main(String[] args) throws InterruptedException {
    Counter c = new Counter();
    new Thread(c).start();
    Thread.sleep(200);
    new Counter().stopCounter();
}

static class Counter implements Runnable {

    Object s = new Object();

    @Override
    public void run() {
        try {
            System.out.println("in");
            synchronized (s) {
                s.wait(10000);
            }
            System.out.println("out");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //...do Something
    }

    public void stopCounter() {
        synchronized (s) {
            s.notifyAll();
        }
        System.out.println("notified");
    }
}
于 2012-09-04T12:17:37.730 に答える