从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

上一篇: Notify() from runnable

下一篇: Implements vs extends: When to use? What's the difference?