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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值