0

我有myThread.wait()那个是synchronzed(myThread)块。我有实现可运行的 Myrunner。我想告诉notify()myRunner,但它不是监控对象。是否可以从 myRunnable 获取 myThread 的句柄以进行通知?还有其他解决方案吗?myRunnable由于某些与我的代码相关的原因,从扩展Thread并运行它并不好。

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);
            }    
        }        
    }
}
4

2 回答 2

0

对于notify()一个wait()ing 线程,您对它所在的对象有很多引用,wait()并且您必须能够获得对它的锁定。我建议您也更改一个通知状态,并在wait()ing 时在循环中检查该状态更改。

唯一的其他选择是更改等待线程的代码。

于 2013-08-01T06:08:20.927 回答
0

两个线程应该使用同一个对象进行同步。此外,您真的不应该使用现有对象进行同步,而是创建一个明确用于同步的对象,例如

Object lock = new Object();

另请参阅https://www.securecoding.cert.org/confluence/display/java/LCK01-J.+Do+not+synchronize+on+objects+that+may+be+reused

如果要使用锁与您的线程进行交互,您可以将其放入线程中并提供一个 getter 供任何人使用。

于 2013-08-01T06:19:14.397 回答