反正还是只有一个线程可以等待并通知自己“唤醒”,或者只有
我有类似的东西,但是它不起作用,并且出现了非法的monitorstateexception
public class test extends Thread{
private int n;
private int lim;
public test(int lim) {
n = 0;
this.lim=lim;
}
public synchronized void add() throws InterruptedException {
n++;
notify();
}
@Override
public void run() {
while(n!=lim){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//do something
}
}
Main
答案 0 :(得分:0)
IllegalMonitorStateException
表示您“不拥有显示器”。为此:
synchronized (this) {
wait()
}
您要触发什么通知?如上所述,如果线程正在等待,则无法采取任何措施。也许您想使用超时?
更新:
要对wait()
进行操作,直到到达lim
,请将其添加到add()
方法中:
if (n >= lim) {
notify();
}
答案 1 :(得分:0)
这里的困惑似乎在于“通知线程”的想法。您通常不会调用notify
对象的notifyAll
,wait
或Thread
。调用您用作锁的任何对象。 (Thread
的一个特殊问题是,它已被用作特定用途的锁(Thread.join
)。)
因此,您需要某种锁定对象:
private final Object lock = new Object();
要等待对象,您需要按住锁,并应在while
循环中检查条件。
synchronized (lock) {
while (!some_condition) {
lock.wait();
}
...
}
要进行通知,请按住锁,然后进行通知(您最好使用notifyAll
,它至少会与notify
一样好,有时可能有必要,但不会陷入测试中)并更改条件。
synchronized (lock) {
lock.notifyAll();
some_condition = true;
}
此外,最好不要继承Thread
的子类。也去其他不必要的子类化。通常,您将创建一个Runnable
并将其传递给构造函数。