【问题标题】:Threads synchronization线程同步
【发布时间】:2016-01-20 16:38:11
【问题描述】:

以下代码创建一个新的 costum Thread 并等待线程结束,然后主线程才再次激活。

  1. 我不太明白它是如何工作的。为什么不立即调用mythread.wait();
  2. 为什么不改用Thread.join()

    public static void main(String[] args) {

        Thread mythread = new MyThread("hello");
        mythread.start();
        synchronized (mythread) {
            try {
                mythread.wait();
            } catch (InterruptedException e) {
    
            }
        }       
    }
    

【问题讨论】:

  • 没有MyThread类的代码很难说...
  • 你可以忽略实现。这只是一个线程在做一些“工作”(基本上会睡几秒钟,就是这样)
  • 那么,实际上,我预计这段代码会无限期地阻塞,因为没有人可以调用mythread.notify()。但我认为程序在 Linux 系统上完成,因为“虚假唤醒”:stackoverflow.com/questions/1050592/….
  • @VictorSorokin 这不是虚假的唤醒。看我的回答。
  • 如果您想等待线程完成,请致电t.join()。如果你想启动一个线程,然后立即加入它而不做任何事情,那有什么意义呢?为什么还要费心使用线程?

标签: java multithreading


【解决方案1】:

它的工作方式是当 myThread 终止时它调用 notifyAll() 来唤醒你的 myThead.wait()。检查 Thread.join() 方法的 java 文档,它引用了它的实现。

Java synchronization is doing auto notify on exit ? Is this expected?

为什么不使用连接呢?我认为你应该。您必须编写的代码更少。它实际上并不比您在此处实现的更多,其他阅读您的代码的人可能更熟悉使用该调用来等待线程退出。

【讨论】:

    【解决方案2】:

    当一个线程完成运行时,它会调用自己的notifyAll()。那是how Thread.join() is implemented:它在线程上等待。因此,由于您的主线程在线程上等待,一旦它完成运行,主线程就会收到通知,并且可以继续执行。

    您违反了记录在案的规则:您永远不应该等待 Thread 对象。您还违反了另一个:wait() 应始终在循环中调用以检查条件。

    【讨论】:

    • 谢谢。顺便说一句,synchronized 到底有什么用?
    • 您不能在没有持有对象监视器的情况下对对象调用 wait()。这就是为什么需要同步的原因。这也记录在 Object.wait() 的 javadoc 中。你为什么不读呢?
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多