multiThreading加入和等待之间的区别,通知

时间:2017-05-09 10:36:22

标签: java multithreading java-threads

我没有在multithreading工作,加入和等待有什么区别,通知方法?差异仅限于获取lock并禁止其他threads访问它,还是有其他用例?

wait可用于完成notify执行时,为什么我应该在multithreadingjointhread

如果提供了任何实时示例,将会很有帮助

5 个答案:

答案 0 :(得分:6)

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

  

等待此线程死亡。

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

方法wait

  

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

     

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

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

  

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

waitnotify的常见用法是访问共享资源。 当资源不可用时,消费者在监视器上等待。 当生产者创建资源时,它通知(或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?

示例:

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

work-with-wait-notify-and-notifyall

答案 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(或实现它作为接口的类)而不是膨胀类层次结构。