您的位置:首页 > 编程语言 > Java开发

java多线程中join方法里到底是强调“暂停”还是“强制”

2018-10-14 22:10 197 查看

直接上代码

子线程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方法是强调的是“暂停”,而不是强制

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: