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 回答