繁体   English   中英

加入和等待之间的多线程区别,通知

[英]multiThreading difference between join and wait,notify

我没有在multithreading工作过,join 和 wait,notify 方法有什么区别? 区别仅限于获取lock并阻止其他threads访问它还是有其他用例?

join可以用于完成thread执行时,为什么我要在multithreading waitnotify

如果提供任何实时示例会有所帮助

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

等待这个线程死亡。

waitnotifynotifyAll方法与一个线程的执行结束无关。

方法wait

使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。

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

方法notifynotifyAll用于唤醒休眠线程:

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


waitnotify常见用途是访问共享资源。 当资源不可用时,消费者在监视器上等待。 当生产者创建资源时,它会通知(或 notifyAll)唤醒等待此资源的线程(或多个线程)。

join 的一个常见用途是阻塞主线程,直到配置线程完成其活动,然后再继续。

join( ):等待这个线程结束。

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

t.join();

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

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

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

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

有关更多详细信息,请参阅以下帖子。

wait() 和 sleep() 的区别

带等待/通知和不带它们的同步块之间的区别?

例子:

java中使用wait()和notify()的简单场景

与等待通知和通知所有人一起工作

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM