介绍
通常使用线程的时候,我们很少需要去阻塞线程,一般通过回调返回数据既可,但是有些场景比方说,线程中需要等待另外一个线程的结果,这时候我们就可以通过显示地去阻塞线程,等待线程结束获得数据。一般可以使用CountDownLatch
或者线程的join方法进行线程的同步阻塞。线程阻塞的一些知识可以查看这篇文章。
使用
join方法,代码如下
private void blockByJoin() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("the thread block by join");
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("join end");
}
通过join方法,使调用thread的线程阻塞直到thread线程终止,就可以得到预期结果,
the thread block by join
join end
使用CountdownLatch,如下:
private void blockByCountDown() {
final CountDownLatch countDownLatch = new CountDownLatch(1);
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("the thread block by countdownLatch");
countDownLatch.countDown();
}
}).start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("countdownLatch end");
}
CountDownLatch通过内置一个线程数量计数器,需要同步多少个线程,构造方法则传入对应的数量,接着在需要阻塞线程的地方调用await方法,在释放线程的地方调用countDown方法既可。相比较于join方法,CountDownLatch的优势在于不需要等待线程死亡才释放,可以在满足条件的地方调用countDown方法就可以让计数减一,相比较于join更灵活可控一些。