java多线程中join方法里到底是强调“暂停”还是“强制”
直接上代码
子线程A
package ThreadDemo; public class MyRunnable1 implements Runnable{ public void run() { //以循环输出1-10 为例 for (int i = 1; i <= 10; i++) { System.out.println("当前线程:("+Thread.currentThread().getName()+")***:"+i); try { Thread.sleep(200);//加载个延迟,跑起来有格调 } catch (InterruptedException e) { e.printStackTrace(); } } } }
子线程B
package ThreadDemo; public class MyRunnable2 implements Runnable{ public void run() { //也是以循环输出1-10 为例 for (int i = 1; i <= 10; i++) { System.out.println("当前线程:("+Thread.currentThread().getName()+")***:"+i); try { Thread.sleep(200);//加载个延迟,跑起来有格调 } catch (InterruptedException e) { e.printStackTrace(); } } } }
主线程C
package ThreadDemo; /** 作为主线程,MyRunnable1和MyRunnable2为子线程 测试join方法中到底是执行的“强制”还是“暂停” */ public class TextJoin { public static void main(String[] args) {//主线程main方法 Thread temp1 = new Thread (new MyRunnable1 (),"子线程temp1");//创建实现类的对象,线程参数并命名 Thread temp2 = new Thread (new MyRunnable2 (),"子线程temp2");//创建实现类的对象,线程参数并命名 temp1.start();//启动线程1 temp2.start();//启动线程2 //主线程也是以循环输出1-10 : for(int i=1; i<=10 ; i++){ System.out.println("当前线程:主线程"+Thread.currentThread().getName()+"运行:"+i); try { Thread.sleep(200);//加载延迟,sleep也要处理异常 } catch (InterruptedException e1) { e1.printStackTrace(); } //这里是触发“强制”或“暂停”的条件,当i到5时,使用join if(i==5){ try { System.out.println("****触发join****"); temp1.join(); //让temp1使用join,测试到底是强制了temp1,还是暂停了main } catch (InterruptedException e) { e.printStackTrace(); }finally{ System.out.println("****join结束****"); } } } } }
从代码中我们看到,join的触发是主线程的循环中i = 5 的时候
而且子线程 MyRunnable1 中的 temp1 调用的.join
而 MyRunnable2 中的temp2 并没有调用
关于join到底是强调“暂停”还是“强制”,我们从字面意义上理解
1.“强制”的执行顺序应该是先执行 MyRunnable1 线程
然后 MyRunnable2 跟 TextJoin 两个线程按照规则交替执行
2.“暂停”的执行顺序应该是先暂停 TextJoin 线程
然后 MyRunnable1 跟 MyRunnable2 两个线程按照规则交替执行
直接运行代码后得到的控制台输出为:
------------------------------------------
当前线程:子线程temp1运行:1
当前线程:子线程temp2运行:1
当前线程:主线程main运行:1
当前线程:子线程temp2运行:2
当前线程:主线程main运行:2
当前线程:子线程temp1运行:2
当前线程:主线程main运行:3
当前线程:子线程temp2运行:3
当前线程:子线程temp1运行:3
当前线程:子线程temp2运行:4
当前线程:主线程main运行:4
当前线程:子线程temp1运行:4
当前线程:子线程temp2运行:5
当前线程:子线程temp1运行:5
当前线程:主线程main运行:5
当前线程:子线程temp1运行:6
触发join
当前线程:子线程temp2运行:6
当前线程:子线程temp2运行:7
当前线程:子线程temp1运行:7
当前线程:子线程temp2运行:8
当前线程:子线程temp1运行:8
当前线程:子线程temp2运行:9
当前线程:子线程temp1运行:9
当前线程:子线程temp2运行:10
当前线程:子线程temp1运行:10
join结束
当前线程:主线程main运行:6
当前线程:主线程main运行:7
当前线程:主线程main运行:8
当前线程:主线程main运行:9
当前线程:主线程main运行:10
-----------------------------------------------
这样我们就能运行结果中得到结论,当触发了join的时候,主线程c暂停了,A与B线程在同时进行,所以:join方法是强调的是“暂停”,而不是强制
- java例程练习(多线程[join()方法])
- 转载:Java多线程中join方法的理解
- JAVA多线程之——wait/yield/sleep/join方法的区别
- java多线程系列_join方法的使用(5)
- Java多线程 之 Thread子类 join方法(五)
- JAVA多线程之——wait/yield/sleep/join方法的区别
- java多线程之join方法使用
- java基本教程之join方法详解 java多线程教程
- java多线程中join方法的理解
- Java多线程中join方法的理解
- Java多线程学习 (二) Thread的join()方法
- JAVA多线程之——wait/yield/sleep/join方法的区别
- java多线程学习之使用join()方法实现线程插队
- java多线程中对于join方法的理解
- 初学Java多线程:join方法的使用
- java多线程 中的join方法
- java 多线程并行求和 之 join() 方法应用
- Java多线程 小知识 守护线程(后台线程)setDaemon、join方法、优先级、yield方法
- java 多线程 join()方法
- Java多线程中join方法的理解(对Thread.join讲解的很详细)