线程间通信Thread.join

桃扇骨 2022-09-11 01:18 223阅读 0赞

在很多应用场景中存在这样一种情况,主线程创建并启动子线程后,如果子线程要进行很耗时的计算,那么主线程将比子线程先结束,但是主线程需要子线程的计算的结果来进行自己下一步的计算,这时主线程就需要等待子线程,java中提供可join()方法解决这个问题。

join()方法的作用,是等待这个线程结束;

也就是说,t.join()方法阻塞调用此方法的线程(calling thread)进入 TIMED_WAITING 状态,直到线程t完成,此线程再继续

通常用于在main()主线程内,等待其它线程完成再结束main()主线程

  1. package com.dongguo.sync;
  2. /** * @author Dongguo * @date 2021/8/23 0023-23:01 * @description: join */
  3. public class ThreadDemo4 {
  4. public static void main(String[] args) {
  5. System.out.println(Thread.currentThread().getName() + "开始执行");
  6. Thread threadA = new Thread(() -> {
  7. System.out.println(Thread.currentThread().getName() + "开始执行");
  8. try {
  9. Thread.sleep(1000);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. System.out.println(Thread.currentThread().getName() + "执行结束");
  14. }, "ThreadA");
  15. Thread threadB = new Thread(() -> {
  16. System.out.println(Thread.currentThread().getName() + "开始执行");
  17. try {
  18. Thread.sleep(3000);
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. System.out.println(Thread.currentThread().getName() + "执行结束");
  23. }, "ThreadB");
  24. try {
  25. threadA.start();
  26. threadA.join();
  27. threadB.start();
  28. threadB.join();
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. System.out.println(Thread.currentThread().getName() + "执行结束");
  33. }
  34. }
  35. 运行结果:
  36. main开始执行
  37. ThreadA开始执行
  38. ThreadA执行结束
  39. ThreadB开始执行
  40. ThreadB执行结束
  41. main执行结束

每个线程的终止的前提是前驱线程的终止,每个线程等待前驱线程终止后,才从join方法返回,实际上,这里涉及了等待/通知机制,即下一个线程的执行需要接受前驱线程结束的通知。

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线通信ThreadLocal

    ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这 个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal

    相关 线通信

    为什么需要线程通讯 线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定的代码逐步的执行,但是如果每个线程间都孤立的运行,那就会造资源浪费。所以在现实中,我们需要这

    相关 Java线通信

    上述例题无条件的阻塞了其他线程异步访问某个方法。Java对象中隐式管程的应用是很强大的,但是你可以通过进程间通信达到更微妙的境界。这在Java中是尤为简单的。 像前面

    相关 线通信

    线程和线程之间不是独立的个体,它们彼此之间可以互相通信和协作。 线程通信就是在线程之间传递信息,保证他们能够协同工作。在线程间进行通信后,系统之间的交互性会更强大,在大大提高

    相关 线通信

    一、引言 线程与线程之间不是相互独立的存在,它们彼此之间需要相互通信和协作。最典型的例子就是生产者-消费者问题。下面首先介绍 wait/notify 机制,并对实现该机制

    相关 线通信

    注意: 必须在同步方法中使用wait和notify方法,因为执行wait和notify的前提条件是必须持有同步方法(或块)的monitor的所有权,否则将会抛出异常