繁体   English   中英

如何使用等待和通知

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM