Java等待特定间隔通知不起作用

时间:2012-09-04 12:10:31

标签: java wait intervals notify

代码段:

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秒。

3 个答案:

答案 0 :(得分:1)

我无法从你的例子中看出你想要实现的目标。如果要尝试替换某种类型的轮询,那么请考虑在Java 5中发布的BlockingQueue接口。由于已经出现,我不需要等待/通知。它使用起来要简单得多,而幕后的java相当于你的等待/通知。

答案 1 :(得分:0)

这取决于你使用它的方式。我刚刚通过添加一个main方法并运行它来尝试它,似乎等待/通知机制工作正常,而不是你描述的方式。请自己尝试一下:

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();
}

答案 2 :(得分:0)

我的猜测是,您在run课程的不同实例上调用stopCounterCounter方法。因此,他们使用不同的监视器(您的s = 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");
    }
}