[英]How to use wait and notify
我正在创建一个 java 应用程序,其中我使用三个线程同时对文本文件执行三个操作。当我单击开始时,我的应用程序中有一个切换按钮我正在调用一个方法 call(),我正在其中创建和启动所有这些线程,当我单击停止时,我正在调用一个新方法 stopcall(),我在其中编写了一个代码来停止所有这些线程。
public void stopcall() throws Exception {
System.out.println("hello stop call");
synchronized(t) {
t.wait();
}
synchronized(t1) {
t1.wait();
}
synchronized(t2) {
t2.wait();
}
}
但是,每当我调用此方法时,stopcall() 方法都无法正常工作,我的应用程序挂了。如果有人帮助我并告诉我如何在我的应用程序中使用等待和通知,我将不胜感激
您的应用程序挂起是因为您正在等待锁定的对象。 wait() 方法会挂起线程,直到另一个线程对该对象使用 notify() 为止。
您必须同步访问共享对象(在本例中为文件)的方法以启用安全线程。 这是一个使用布尔标志来指示资源当前是否正在使用的示例。
如果正在使用,下一个线程将调用 wait() 并等待通知。
同时,当“当前使用”线程完成同步块时 - 它会调用 notifyAll() 来提醒所有等待线程资源空闲。
public class TestSync {
private boolean fileInUse = false;
public synchronized void syncWriting() {
// blocks until a the file is free. if not - the thread will 'wait'.
// when notified : will do the while-loop again
while (true) {
if (!fileInUse){
System.out.println("using the free file");
fileInUse = true;
//
// code to write and close the file
//
notifyAll();
return;
}
try {
// wait if file in use. after being notified :
wait();
} catch (InterruptedException e) {e.getMessage();}
}
}
wait()
/ notify()
/ notifyAll()
方法相当容易理解。
foo.wait()
释放foo
上的锁,然后它会休眠直到foo
被通知,然后在它返回之前重新获取锁。
foo.notifyAll()
唤醒所有在foo.wait()
调用中休眠的线程。 如果在调用时没有线程在休眠,则它根本不执行任何操作。
foo.notify()
与foo.notifyAll()
相同,除了它只选择一个休眠线程(如果有)并唤醒它。
使用wait()
和notify()
的技巧是,假设您希望某个线程 A 使用foo.notify()
唤醒线程 B。 您如何保证线程 B在线程 A 调用foo.notify()
之前已经在foo.wait()
调用中foo.notify()
?
请记住:如果通知首先发生,那么它将“丢失”。 也就是说,notify 什么都不做,wait 永远不会返回。
这给我们带来了为什么 foo.wait() 和 foo.notify() 只允许从synchronized(foo)
块内部调用的原因。 您应该使用同步和一些共享变量来防止线程 A 等待()已发生的通知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.