基础知识一大堆之Thread:join

本文详细解析了Java线程Join()方法的实现原理,并通过实例演示了其在多线程同步控制中的应用。通过代码实验,展示了加入Join()前后线程执行顺序的变化,以及对线程生命周期的影响。进一步分析了join(long millis)方法的内部机制,包括其等待线程结束的条件和退出机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信大家看api文档是不会搞清楚join()这个方法真正意义的,下面我用几行代码尽量言简意赅的说一下:

 

public class ThreadTest {
	public static void main(String[] args) throws Exception {
		ThreadTest tt = new ThreadTest();
		
		tt.testJoin();
	}
	
	public void testJoin() throws Exception {
		MyThread mt1 = new MyThread();
		mt1.start();
		
		long start = System.currentTimeMillis();
		
		// mt1.join();
		
		System.out.printf("testJoin over. Cost %d ms.\n", System.currentTimeMillis() - start);
	}
}

class MyThread extends Thread {
	public void run() {
		System.out.println(this.getName() + " start...");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(this.getName() + " over.");
	}
}

运行上面的代码,得到的结果可能如下(第一句和第二句位置不固定)

Thread-0 start...
testJoin over. Cost 0 ms. //是的,这句会先执行
Thread-0 over.

是的,

System.out.printf("testJoin over. Cost %d ms.\n", System.currentTimeMillis() - start);

 这一句会先于

System.out.println(this.getName() + " over.");

 

 执行,且,打印出的 Cost 会是0ms。

 

这是因为 执行 mt1.start(); 后,会启一个Thread-0线程,主线程继续执行,而Thread-0线程则sleep 1000ms,

所以,就会出现上面的状况。

 

那么,我们将上面程序中 注释掉的那句mt1.join(); 加上,就会出现下面的结果:

Thread-0 start...
Thread-0 over.
testJoin over. Cost 1000 ms.

 

再看API文档中对join()方法的描述:等待该线程终止。  该线程是哪个线程?在上面的代码中,指的就是mt1.start();所创造出来的线程。

 

----------延伸-----------

 

而,如果我们给join 加上 参数,

第一次是: 

 

mt1.join(30);

 

 结果是:

 

Thread-0 start...
testJoin over. Cost 31 ms.
Thread-0 over.

 

 第二次是:

 

mt1.join(2000);

 结果是:

 

 

Thread-0 start...
Thread-0 over.
testJoin over. Cost 1000 ms.// 这里是1000,而不是2000
 

 

分析一下原因:

 

两种状况可导致join(long millis)方法退出:  主线程isAlive==false;等待毫秒数>millis。

 

 

PS:语言表达能力有限,可能说的不清楚。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值