在主線程中啟動(dòng)了子線程,如果子線程要進(jìn)行大量耗時(shí)運(yùn)行,主線程往往早于子線程結(jié)束,如果主線程想等在子線程結(jié)束后再結(jié)束,如主線程想要使用子線程運(yùn)算結(jié)果,這時(shí)就需要使用join()方法, join()方法的作用是等待線程對(duì)象銷毀,在當(dāng)前線程中加入子線程,當(dāng)前線程會(huì)轉(zhuǎn)為等待狀態(tài),等到子線程運(yùn)行結(jié)束后,當(dāng)前線程再繼續(xù)向下執(zhí)行。
package com.wkcto.join;
import java.util.Random;
/**
* 演示join方法
*/
public class Test {
static class SubThread extends Thread{
@Override
public void run() {
int xx = new Random().nextInt(10000);
System.out.println("在子線程中產(chǎn)生了數(shù)據(jù): " + xx);
try {
Thread.sleep(xx); //模擬子線程運(yùn)行耗時(shí)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
SubThread t = new SubThread();
t.start();
// Thread.sleep();
t.join(); //程序執(zhí)行這條語(yǔ)句,當(dāng)前main線程會(huì)轉(zhuǎn)為等待狀態(tài),等到t線程運(yùn)行結(jié)束后,當(dāng)前線程會(huì)轉(zhuǎn)為Runnable可運(yùn)行狀態(tài)
System.out.println("當(dāng)前線程是主線程,想在t線程執(zhí)行完后再執(zhí)行,可以在這條語(yǔ)句前通過(guò)sleep()讓主線程睡眠,但是睡眠的時(shí)長(zhǎng)如何確定? 因?yàn)樽泳€程耗時(shí)不確定,所以主線程睡眠的時(shí)長(zhǎng)不確定.這時(shí),就可以使用join()方法");
}
}