您好,登录后才能下订单哦!
如何进行并发工具类CountDownLatch与CyclicBarrier分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
CountDownLatch
基本的流程是一个线程等待其他的线程完成工作以后再执行,加强版join
类的主要方法,await用来等待,countDown(在线程里面)用来减一。
由初始化线程决定是否放行。
我们来用代码演示下CountDownLatch的基本使用:
public class UserCountDownLatch {
static CountDownLatch latch = new CountDownLatch(6);
//初始化线程
private static class InitThread implements Runnable{
@Override
public void run() {
System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work ...");
latch.countDown();//初始化线程完成工作了。扣一次
}
}
public static void main(String[] args) throws InterruptedException {
//单独的初始化线程,初始化分为2步,需扣减两次
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step lst.....");
latch.countDown();//每完成一步工作,就扣减一次
System.out.println("begin step 2nd......");
Thread.sleep(1000);
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 2nd.....");
latch.countDown();//每完成一步工作,就扣减一次
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
for(int i=0;i<=3;i++){
Thread thread = new Thread(new InitThread());
thread.start();
}
latch.await();
System.out.println("Main do ites work ....");
}
}
结果:
Thread_14 ready init work ...Thread_12 ready init work ...Thread_11 ready init work ...Thread_13 ready init work ...Thread_10 ready init work step lst.....begin step 2nd......Thread_10 ready init work step 2nd.....Main do ites work ....
小结:就必须等到countDown减完才开始执行main方法后面的程序。
CyclicBarrier
让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏障时,屏障开放,所有被阻塞的线程会继续运行。
由工作线程决定是否运行。
我们来用代码演示下CyclicBarrier的基本使用:
public class UseCyclicBarrier { private static CyclicBarrier barrier = new CyclicBarrier(5,new CollectThread());//屏障开放后,CollectThread()就会执行. private static ConcurrentHashMap<String, Long> resultMap = new ConcurrentHashMap<String, Long>();//存放子线程工作结果的容器 public static void main(String[] args){ for(int i=0;i<=4;i++){ Thread thread = new Thread(new SubThread()); thread.start(); } } //负责屏障开放以后的工作 private static class CollectThread implements Runnable{ @Override public void run() { StringBuilder result = new StringBuilder(); for(Map.Entry<String, Long> workResult:resultMap.entrySet()){ result.append("["+workResult.getValue()+"]"); } System.out.println("the result = "+result); System.out.println("do other business......"); } } //工作线程 private static class SubThread implements Runnable{ @Override public void run() { long id = Thread.currentThread().getId(); resultMap.put(Thread.currentThread().getId()+"", id); Random r = new Random();//随机决定工作线程的是否睡眠 try{ if(r.nextBoolean()){ Thread.sleep(2000+id); System.out.println("Thread_"+id+".....do its business "); } System.out.println(id+".....is await"); barrier.await();// Thread.sleep(1000+id); System.out.println("Thread_"+id+".....do its business "); }catch(Exception e){ e.printStackTrace(); } } } }
小结:在初始化的时候,开放屏障后,可以使用指定执行的线程。
CyclicBarrier(int parties,RunnablebarrierAction)
不同在于动作的实施者是不同的,CountDownLatch 的下一步动作实施者是main函数,而CyclicBarrier下一步的动作实施者可以为其他线程。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。