![](/img/trans.png)
[英]What is the difference between wait/notify and wait/interrupt?
[英]multiThreading difference between join and wait,notify
我没有在multithreading
工作过,join 和 wait,notify 方法有什么区别? 区别仅限于获取lock
并阻止其他threads
访问它还是有其他用例?
当join
可以用于完成thread
执行时,为什么我要在multithreading
wait
和notify
?
如果提供任何实时示例会有所帮助
方法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 的一个常见用途是阻塞主线程,直到配置线程完成其活动,然后再继续。
join(
):等待这个线程结束。
join方法允许一个线程等待另一个线程的完成。 如果 t 是其线程当前正在执行的 Thread 对象,
t.join();
导致当前线程暂停执行,直到 t 的线程终止。
wait()
:使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。
notify()
:唤醒在此对象的监视器上等待的单个线程。 如果有任何线程正在等待该对象,则选择其中一个线程被唤醒。
notifyAll()
:唤醒在此对象监视器上等待的所有线程。 线程通过调用等待方法之一在对象的监视器上等待。
有关更多详细信息,请参阅以下帖子。
例子:
join() 方法等待一个线程死亡。 而 wait() 和 notify() 用于线程间通信。 换句话说,这些方法将阻塞线程,直到满足某些条件。
假设我们有 2 个线程运行线程 1 和线程 2。
如果我们在 Thread-1 上应用 join,那么 Thread-2 想要等到 Thread-2 完成。
假设 Thread-1 包含数千行,但 Thread-2 想等到第 10 行完成。
如果我们使用 join 则 Thread-2 要等到 Thread-1 完成。 如果我们使用Wait 和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
}
}
此实现使用以 this.isAlive 为条件的 this.wait 调用循环。 当线程终止时,调用 this.notifyAll 方法。 建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。
等待Thread
终止(和清理)的正确方法是join()
。
该文档建议您不要在Thread
实例上使用wait()
、 notify()
或notifyAll()
。
恕我直言,将监视器添加到java.lang.Object
是错误的。 它与大多数类完全无关,膨胀实现并导致不当使用。
声明方法synchronized
的能力也是一个错误。 它往往会延长关键部分,如果确实需要(不是),可以将其限制为某个类java.lang.Synchronizable
(或将其作为接口实现的类),而不是使类层次结构膨胀。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.