并发编程学习之join()方法

版权声明: https://blog.csdn.net/Dongguabai/article/details/82255331

线程之间的协作就跟人与人之间的协作一样,有时候我们需要等待别人完成某项任务后,我们再来开始工作。有时候会出现一个线程的输入非常依赖另一个或多个线程的输出,此时这个线程就需要等待依赖线程执行完毕才能继续执行。在Thread类中有join()方法具有这样的功能:

第三个方法是无限等待,他会一直阻塞当前线程,直到目标线程执行完毕。前两个方法就定义了一个最大等待时间,时间过了,当前线程“等不及了”会继续往下执行。要注意的是join()的本质是让调用线程wait()在当前线程对象的实例上(具体wait()方法的介绍可以参看:https://blog.csdn.net/Dongguabai/article/details/82230279)。join()方法的源码如下:

这里有一个代码示例:

package dgb.test.concurrent;

import lombok.extern.slf4j.Slf4j;

/**
 * @author Dongguabai
 * @date 2018/8/31 15:17
 */
@Slf4j
public class JoinTest {

    private static volatile int i = 0;

    static class Thread1 extends Thread{
        @Override
        public void run() {
            log.info("Thread1线程开始运行!!!");
            for (i=0;i<10000000;i++);
            log.info("Thread1线程运行结束!!!");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        log.info("主线程开启-------------");
        Thread1 t1 = new Thread1();
        t1.start();
        t1.join();
        log.info("主线程结束-------------{}",i);
    }
}

运行结果:

在运行结果的最后输出的i是10000000,证明了join()方法的效果,因为假如这里没有join()方法,在main()中输出的i应该为0或者特别小。

再简单分析一下main()中代码的执行流程:

有一个关键的地方就是thread1.wait()后,主线程会进入了thread1的等待队列中,在thread1执行完成后,会调用thread1.notify()方法,释放所有等待线程继续执行:

因此建议在程序中不要在Thread对象实例上使用类似wait()或者notify()等方法,因为这个很有可能影响系统API的工作或者被系统的API锁影响。

猜你喜欢

转载自blog.csdn.net/Dongguabai/article/details/82255331