2017-05-09 91 views
1

我没有在multithreading工作过,加入和等待,通知方法有什么区别?是否仅限于获得lock的差异,并避免其他threads访问它或者是否存在其他用例?多线程加入和等待之间的区别,通知

为什么我应该去为multithreadingwaitnotifyjoin可用于thread执行完毕?

如果有实时的例子已经提供

+0

[等待(长时间超时)和连接(长时间毫秒)之间的区别?](http://stackoverflow.com/questions/8818721/difference-between-waitlong-timeout-and-joinlong-millis) – aUserHimself

回答

1

的join()方法等待线程死亡这将是有益的。 wait()和notify()用于线程间通信。换句话说,这些方法会阻塞线程,直到满足某些条件。

3

方法join(的Thread类)等待线程死亡:

等待该线程死亡。

方法waitnotifynotifyAll不相关的一个线程的执行结束。

方法wait

造成当前线程等待,直到其他线程调用notify()方法或此对象的notifyAll的()方法。

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

方法notifynotifyAll用来唤醒一个沉睡的线程:

唤醒在此对象监视器上等待的单个线程。


wait的与notify的一个常见用途是访问共享资源。 当资源不可用时,消费者在显示器上等待。 当生产者创建资源时,它通知(或notifyAll)唤醒等待该资源的线程(或多个线程)。

连接的常见用法是阻止主线程,直到配置线程完成其活动,然后再继续。

1

join():等待此线程死亡。

join方法允许一个线程等待另一个线程的完成。如果T是一个Thread对象,它的线程当前执行,

t.join(); 

导致当前线程,直到T的线程终止暂停执行。

wait():导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。

notify():唤醒正在等待该对象监视器的单个线程。如果任何线程正在等待这个对象,则选择其中一个线程来唤醒。

notifyAll():唤醒在该对象监视器上等待的所有线程。线程通过调用其中一个等待方法来等待对象的监视器。

请参阅下面的帖子了解更多详情。

Difference between wait() and sleep()

Difference between Synchronized block with wait/notify and without them?

例子:

A simple scenario using wait() and notify() in java

work-with-wait-notify-and-notifyall

0

此实现使用空调上this.wait呼叫的环this.isAlive。由于线程终止this.notifyAll方法调用了 。建议应用程序不要在Thread实例上使用wait,notify或者notifyAll。

等待Thread终止(和清理)的正确方法是join()

的文档建议您使用wait()notify()notifyAll()Thread实例。

恕我直言,这是一个错误的增加一个显示器java.lang.Object。这与大多数类完全无关,膨胀实现并导致不适当的使用。

声明方法​​的能力也是一个错误。它倾向于延长关键部分,并且如果确实需要(不是这样),则可以将其限制在某些类别(或将其实现为接口的类别),而不是膨胀类别层次结构。