从runnable通知()
我有myThread.wait()
是synchronzed(myThread)
块。 我有Myrunner实现可运行。 我想告诉myRunner的notify()
,但它不是监视器对象。 是否有可能从myRunnable处理myThread来进行通知? 还有其他解决方案吗? 从Thread
扩展myRunnable
并运行它是不好的,因为我的代码特定相关的一些原因。
public class ThreadMain {
public Thread reader;
private class SerialReader implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(3000);
synchronized(this) {
System.out.println("notifying");
notify();
System.out.println("notifying done");
}
} catch (Exception e) {
System.out.println(e);
}
}
}
}
ThreadMain() {
reader = new Thread(new SerialReader());
}
public static void main(String [] args) {
ThreadMain d= new ThreadMain();
d.reader.start();
synchronized(d.reader) {
try {
d.reader.wait();
System.out.println("got notify");
} catch (Exception e) {
System.out.println(e);
}
}
}
}
两个线程都应该使用同一个对象进行同步。 此外,您应该确实不使用现有的对象进行同步,而是创建一个要明确用于同步的对象
Object lock = new Object();
另见https://www.securecoding.cert.org/confluence/display/java/LCK01-J.+Do+not+synchronize+on+objects+that+may+be+rerere
如果要使用该锁与您的线程进行交互,可以将其放入线程中,并为任何人提供一个吸气器来使用它。
为了notify()
一个wait()
线程,你有很多对wait()
对象的引用,并且你必须能够获得对它的锁定。 我建议你也改变一个状态,通知你并在wait()
时检查循环中的状态改变。
唯一的其他选择是更改等待线程的代码。
链接地址: http://www.djcxy.com/p/16387.html下一篇: Implements vs extends: When to use? What's the difference?