代码段:
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秒。
答案 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
课程的不同实例上调用stopCounter
和Counter
方法。因此,他们使用不同的监视器(您的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");
}
}