今天面试遇到的问题,需要把两个线程的数据组合起来,怎么保证两个线程执行完成?
我的回答是,new 两个线程T1和T2
然后线程处理完数据后,
T1.join();
T2.join();
这样就会等待两个线程处理完后组装数据。
当时面试官说这是一种实现,问我还有没有其他实现,我说暂时没想到
下面是我面完回家查资料看到的
1.用CyclicBarrier
CyclicBarrier cb= new CyclicBarrier(2);
Thread T1 = new Thread(new Runnable(){
@Override
public void run(){
dosomething;
cb.await();
}
});
Thread T2 = new Thread(new Runnable(){
@Override
public void run(){
dosomething;
cb.await();
}
});
2.用CountDownLatch
CountDownLatch countDownLatch = new CountDownLatch(2);
Thread T1 = new Thread(new Runnable(){
@Override
public void run(){
dosomething;
countDownLatch.countDown();
}
});
Thread T2 = new Thread(new Runnable(){
@Override
public void run(){
dosomething;
countDownLatch.countDown();
}
});
countDownLatch.await();
CyclicBarrier与CountDownLatch比较
1.CountDownLatch只能使用一次,CyclicBarrier可以调用reset()重置,可以多次使用
2.CountDownLatch是一个线程(或多个线程)等待另外N个线程完成任务之后才能执行;CyclicBarrier是N个线程互相等待,任何一个线程没完成之前,所有线程必须等待。
3.CountDownLatch基于AQS,CyclicBarrier基于锁和Condition