基础知识一大堆之Thread:join

相信大家看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、付费专栏及课程。

余额充值