Thread类中提供的join方法可以让线程插队,比如A、B两个线程,在A线程中调用B线程的join方法,那么执行结果一定是A线程在B线程执行结束之后再执行自己下面的逻辑
Thread B=new Thread(new Runnable() {
@Override
public void run() {
try {
countDownLatch.await();
System.out.println("B线程首先执行");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B线程执行结束");
}
});
Thread A=new Thread(new Runnable() {
@Override
public void run() {
try {
countDownLatch.await();
System.out.println("A执行");
B.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A执行结束");
}
});
B.start();A.start();
countDownLatch.countDown();
}
执行结果
B线程首先执行
A执行
B线程执行结束
A执行结束
从执行结果来看,A并没有在B线程完全结束之后再执行,如果想让A在B执行结束之后再执行就要加锁来实现了,下面是加锁代码
Object lock=new Object();
Thread B=new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock){
try {
countDownLatch.await();
System.out.println("B线程首先执行");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B线程执行结束");
}
}
});
//被插队线程
Thread A=new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock){
try {
countDownLatch.await();
System.out.println("A执行");
//插队线程插队,先于bejoined线程执行完毕
B.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A执行结束");
}
}
});
B.start();A.start();
countDownLatch.countDown();
执行结果
B线程首先执行
B线程执行结束
A执行
A执行结束
网友评论