我没有在multithreading
工作,加入和等待有什么区别,通知方法?差异仅限于获取lock
并禁止其他threads
访问它,还是有其他用例?
当wait
可用于完成notify
执行时,为什么我应该在multithreading
中join
和thread
?
如果提供了任何实时示例,将会很有帮助
答案 0 :(得分:6)
方法join
(类Thread
)等待线程死亡:
等待此线程死亡。
方法wait
,notify
,notifyAll
与一个线程的执行结束无关。
方法wait
:
导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()
方法notify
和notifyAll
用于唤醒睡眠线程:
唤醒正在此对象监视器上等待的单个线程。
wait
与notify
的常见用法是访问共享资源。
当资源不可用时,消费者在监视器上等待。
当生产者创建资源时,它通知(或notifyAll)唤醒等待该资源的线程(或线程)。
join的常见用法是阻塞主线程,直到配置线程在继续之前完成其活动。
答案 1 :(得分:2)
join()方法等待线程死亡。而wait()和notify()用于线程间通信。换句话说,这些方法将阻塞线程,直到满足某些条件。
答案 2 :(得分:2)
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?
示例:
答案 3 :(得分:1)
假设我们有2个线程分别运行线程1和线程2。
如果我们在线程1上应用join,则线程2希望等到线程2完成。
假定线程1包含数千行,但是线程2希望等到第1行10行完成。.
如果我们使用join,那么线程2要等到线程1完成。 如果我们使用Wait and Notify,那么就不必等到Thread-1完成。在Thread-1的前10行完成后,其他线程可以恢复。
public class JoinDrawBack {
static int sum=0;
public static void main(String a[]) throws InterruptedException {
MyThread thread_1=new MyThread();
thread_1.start(); //starting thread_1
thread_1.join(); //applying join on Thread-1
System.out.println(sum); //thread-2 printing the sum
//here thread-2 wants to wait till completion of run method,
//when we use join then there is no need to wait such a long time.
}}class MyThread extends Thread{
public void run(){
for(int i=0;i<10;i++){
JoinDrawBack.sum=JoinDrawBack.sum+i;
}
///thousands of lines
}
}
答案 4 :(得分:0)
此实现使用this.wait调用的循环 this.isAlive。当一个线程终止this.notifyAll方法时 调用。建议应用程序不使用wait,notify或 在线程实例上的notifyAll。
等待Thread
终止(和清理)的正确方法是join()
。
文档建议您不在wait()
个实例上使用notify()
,notifyAll()
或Thread
。
恕我直言,将监视器添加到java.lang.Object
是错误的。它与大多数类,bloats实现完全无关,并导致使用不当。
声明方法synchronized
的能力也是一个错误。它倾向于延长关键部分,如果确实需要(它不是)可以限制在某个类java.lang.Synchronizable
(或实现它作为接口的类)而不是膨胀类层次结构。