等待并在同一线程上通知

时间:2018-12-11 22:32:43

标签: java multithreading synchronization

反正还是只有一个线程可以等待并通知自己“唤醒”,或者只有

我有类似的东西,但是它不起作用,并且出现了非法的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

2 个答案:

答案 0 :(得分:0)

IllegalMonitorStateException表示您“不拥有显示器”。为此:

synchronized (this) {
    wait()
}

您要触发什么通知?如上所述,如果线程正在等待,则无法采取任何措施。也许您想使用超时?

更新:

要对wait()进行操作,直到到达lim,请将其添加到add()方法中:

if (n >= lim) {
    notify();
}

答案 1 :(得分:0)

这里的困惑似乎在于“通知线程”的想法。您通常不会调用notify对象的notifyAllwaitThread。调用您用作锁的任何对象。 (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并将其传递给构造函数。