t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。当t执行完后才会执行其他未start的线程,使得线程之间的并行执行变成串行执行。
public class MyTest {
public static void main(String[] args) throws Exception{
Thread t1 = new Thread(){
public void run() {
for(int i=1;i<=10;i++){
System.out.println("AAAAAAAAAAAAAA");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t2 = new Thread(){
public void run() {
for(int i=1;i<=10;i++){
System.out.println("BBBBBBBBBBB");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
};
Thread t3 = new Thread(){
public void run() {
for(int i=1;i<=10;i++){
System.out.println("CCCCCCCCCCC");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
};
t1.start();
//t2在 t1.join开启前,start,所以 t1和t2是交互执行的
//代码中把t2设置了 sleep 比较长,所以t1执行完的时候,t2还未执行完成,后面t2与t3交替执行
t2.start();
t1.join();
//t1.join开启的时候,t3线程还未start,所以需要等待t1线程执行完成才能执行
t3.start();
}
}
执行结果:
1、t2线程 sleep(10)
BBBBBBBBBBB
AAAAAAAAAAAAAA
BBBBBBBBBBB
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
BBBBBBBBBBB
BBBBBBBBBBB
AAAAAAAAAAAAAA
BBBBBBBBBBB
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
BBBBBBBBBBB
AAAAAAAAAAAAAA
BBBBBBBBBBB
BBBBBBBBBBB
AAAAAAAAAAAAAA
BBBBBBBBBBB
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
t2线程 sleep(100)
AAAAAAAAAAAAAA
BBBBBBBBBBB
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
AAAAAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
BBBBBBBBBBB
CCCCCCCCCCC
CCCCCCCCCCC
CCCCCCCCCCC
BBBBBBBBBBB
CCCCCCCCCCC
CCCCCCCCCCC
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB