Join的使用

目的:当子线程运行结束后,父线程才能再继续运行

/**
* @ClassName ThreadJoinExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadJoinExample {
public static void main(String[] args) throws InterruptedException {
Runnable r = new Runnable() {
@Override
public void run() {
String tName = Thread.currentThread().getName();
try {
System.out.println(tName + "开始运行");
Thread.sleep(4000);
System.out.println(tName +"运行结束!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(r,"子任务1");
Thread thread2 = new Thread(r,"子任务2");
thread.start();
thread2.start();
thread.join(); //子线程阻塞主线程,待子线程运行结束
thread2.join(); //子线程阻塞主线程,待子线程运行结束
Thread.sleep(1000);
System.out.println("主线程运行结束!");
}
}

不能interrupt中断一个有join()子线程的父线程

/**
* @ClassName ThreadInterruptJoinThread
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadInterruptJoinThread {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread("parent"){
@Override
public void run() {
System.out.println(getName() + "开始运行");
Thread thread1 = new Thread("child"){
@Override
public void run() {
System.out.println(getName() + "开始运行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "运行结束");
}
};
thread1.start();
//thread1.join();
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "运行结束");
}
};
thread.start();
Thread.sleep(1000);
thread.interrupt();
thread.join();
System.out.println("主线程运行结束");
}
}

如上代码执行结果:join的child子线程还没结束,父线程就被interrupt中断,会导致父线程异常,且不再等待子线程child运行结束。

join(long):等待指定时间不结束就不等待了

/**
* @ClassName ThreadJoinTime
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadJoinTime {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread("child"){
@Override
public void run() {
System.out.println("子线程开始运行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程运行结束");
}
};
thread.start();
thread.join(1000);
System.out.println("主线程代码运行结束");
}
}

最新文章

  1. java中Array/List/Map/Object与Json互相转换详解
  2. C++调用V8与JS交互
  3. 完全平方数(钟神的hao)
  4. jquery ui 改写cloes事件
  5. SQL Server 数据导入Mysql详细教程
  6. iOS 字体滚动效果 ScrollLabel
  7. 蓝桥杯D1
  8. 调用firebug-lite调试ie6
  9. Java IO学习笔记六
  10. NOIP2017SummerTraining0710
  11. 女皇武则天:我不愿被 extends
  12. hbase coprocessor 二级索引
  13. 《SQL CookBook 》笔记-准备工作
  14. 步步为营-20-XML
  15. listview控件专题
  16. properties文件读取
  17. C#操作共享文件夹
  18. php设计模式-工厂设计模式
  19. BBED标记坏块以及修复坏块
  20. String拾遗

热门文章

  1. 一个 Linux 后台程序编程案例分析
  2. CF1156F Card Bag
  3. 记一次VS2010和VS2015自定义颜色的过程
  4. [R] venn.diagram保存pdf格式文件?
  5. PHP非对称加密-RSA
  6. 学习资源 Docker从入门到实践 pdf ,docker基础总结导图
  7. C语言 序列反向互补函数
  8. 4.Reverse Words in a String-Leetcode
  9. typedef 的用法
  10. 商业爬虫学习笔记day7-------解析方法之bs4