Java多线程(2):线程加入/join()

线程加入

join()方法,等待其他线程终止。在当前线程(主线程)中调用另一个线程(子线程)的join()方法,则当前线程转入阻塞状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态。

也就是主线程中,子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。

在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束。

如下例子:

1 class JoinRunnable implements Runnable { 2     @Override 3     public void run() { 4         System.out.println("Child thread start."); 5         try { 6             for (int i = 1; i <= 5; i++) { 7                 System.out.println("Child thread runing [" + i + "]."); 8                 Thread.sleep((int) (Math.random() * 100)); 9             }10         } catch (InterruptedException e) {11             System.out.println("Child thread interrupted.");12         }13         System.out.println("Child thread end.");14     }15 }16 17 public class JoinDemo {18     // main是主线程19     public static void main(String args[]) {20         System.out.println("Main thread start.");21         new Thread(new JoinRunnable()).start();22         System.out.println("Main thread end.");23     }24 }

执行结果:

Main thread start.Main thread end.Child thread start.Child thread runing [1].Child thread runing [2].Child thread runing [3].Child thread runing [4].Child thread runing [5].Child thread end.

如果主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。

如下例子:

1 class JoinRunnable implements Runnable { 2     @Override 3     public void run() { 4         System.out.println("Child thread start."); 5         try { 6             for (int i = 1; i <= 5; i++) { 7                 System.out.println("Child thread runing [" + i + "]."); 8                 Thread.sleep((int) (Math.random() * 100)); 9             }10         } catch (InterruptedException e) {11             System.out.println("Child thread interrupted.");12         }13         System.out.println("Child thread end.");14     }15 }16 17 public class JoinDemo {18     // main是主线程19     public static void main(String args[]) {20         System.out.println("Main thread start.");21         Thread t = new Thread(new JoinRunnable());22         t.start();23         try {24             t.join();25         } catch (InterruptedException e) {26             e.printStackTrace();27         }28         System.out.println("Main thread end.");29     }30 }

执行结果:

Main thread start.Child thread start.Child thread runing [1].Child thread runing [2].Child thread runing [3].Child thread runing [4].Child thread runing [5].Child thread end.Main thread end.
(0)

相关推荐

  • Java 浅析 Thread.join()

    概要 本文分三个部分对Thread.join()进行分析: 1. join() 的示例和作用 2. join() 源码分析 3. 对网上其他分析 join() 的文章提出疑问 1. join() 的示 ...

  • 并发编程之:CountDownLatch

    大家好,我是小黑,一个在互联网苟且偷生的农民工. 先问大家一个问题,在主线程中创建多个线程,在这多个线程被启动之后,主线程需要等子线程执行完之后才能接着执行自己的代码,应该怎么实现呢? Thread. ...

  • JAVA多线程学习笔记整理

    多线程: 三种创建方法 继承Thread类,以线程运行内容重写run方法,创建Thread对象并用start方法启动该线程. (匿名内部类) (Lambda表达式) 实现Runable接口,以线程运行 ...

  • java学习——115.线程的互斥

    线程互斥是解决线程间竞争关系的手段. 在上一篇中,由于两个线程对同一个账户资源进行操作,两线程在同时对"张三"这个账户时进行操作时,存在着竞争关系,就造成了输出结果的不正确. 要解 ...

  • java学习——111.线程的状态

    线程是从创建到执行完毕,总共有6个状态, 1. New(新建态) 当用new操作符创建一个新线程时,如 new Thread(r), 该线程还没有开始运行.这意味着它的状态是new. 2. Runna ...

  • Java多线程访问Synchronized同步方法的八种使用场景

    简介 本文将介绍7种同步方法的访问场景,我们来看看这七种情况下,多线程访问同步方法是否还是线程安全的.这些场景是多线程编程中经常遇到的,而且也是面试时高频被问到的问题,所以不管是理论还是实践,这些都是 ...

  • Java多线程(3):wait()/notify()实例

    下面是代码实例 1 public class WaitDemo implements Runnable { 2 3 private Object lock; 4 5 public WaitDemo(O ...

  • Java多线程(1):3种常用的实现多线程类的方法

    (1) 继承java.lang.Thread类(Thread也实现了Runnable接口) 继承Thread类的方法是比较常用的一种,如果说你只是想起一条线程.没有什么其它特殊的要求,那么可以使用Th ...

  • Java多线程

    什么是多线程 提到线程,不得不先说一下什么是进程. 进程就是正在运行的程序.当一个程序进入内存运行时,即变成一个进程.每个进程都有独立的代码和数据空间(进程上下文).一个进程包含1--n个线程.一个线 ...

  • Java多线程上下文传递在复杂场景下的实践

    一.引言 海外商城从印度做起,慢慢的会有一些其他国家的诉求,这个时候需要我们针对当前的商城做一个改造,可以支撑多个国家的商城,这里会涉及多个问题,多语言,多国家,多时区,本地化等等.在多国家的情况下如 ...

  • java多线程并发实例

    package cn.crhms.modelsystem.utils;import java.util.ArrayList;import java.util.List;import java.util ...