java锁之CountDownLatch(等待最后一个完成)
2016-07-28 11:19
381 查看
线程同步工具,允许一个线程(或者多个线程)等待其他所有线程执行完毕后再执行。
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务, 4000 然后在闭锁上等待的线程就可以恢复执行任务。期待最后一个worker赶完活
闭锁:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。即,一组线程等待某一事件发生,事件没有发生前,所有线 程将阻塞等待;而事件发生后,所有线程将开始执行;闭锁最初处于封闭状态,当事件发生后闭锁将被打开,一旦打开,闭锁将永远处于打开状态。
public static void main(String[] args) throws Exception { ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(); PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor); cm.setMaxTotal(100); CloseableHttpAsyncClient httpAsyncClient = HttpAsyncClients.custom().setConnectionManager(cm).build(); httpAsyncClient.start(); String[] urisToGet = { "http://www.sohu.com/", "http://www.sina.com/", "http://www.qq.com/", }; //设置需要等待的线程数 final CountDownLatch latch = new CountDownLatch(urisToGet.length); for (final String uri: urisToGet) { final HttpGet httpget = new HttpGet(uri); httpAsyncClient.execute(httpget, new FutureCallback<HttpResponse>() { public void completed(final HttpResponse response) { System.out.println(latch.getCount()); latch.countDown();//工作线程做完之后将计数器减一 System.out.println(httpget.getRequestLine() + "->" + response.getStatusLine()); } public void failed(final Exception ex) { System.out.println(latch.getCount()); latch.countDown(); System.out.println(httpget.getRequestLine() + "->" + ex); } public void cancelled() { System.out.println(latch.getCount()); latch.countDown(); System.out.println(httpget.getRequestLine() + " cancelled"); } }); } latch.await(); //阻塞主线程,直到latch减到0,才执行后面的程序 System.out.println("-----work is done !"); }
三个http调用结束了才会解除主线程的锁定状态,执行最后一条输出语句
相关文章推荐
- [Java并发]使用CountDownLatch和CyclicBarrier等待多线程完成
- Java多线程等待所有线程结束(CountDownLatch/CyclicBarrier)
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier)
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
- java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring Even
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier)
- java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring EventListener,超时处理和空循环性能优化
- 等待多线程完成的CountDownLatch
- 并发工具类:等待多线程完成的CountDownLatch,和join的区别
- Java CountDownLatch完成异步回调实例详解
- Java多线程协作CountDownLatch,主线程等待子线程结束
- java 并发完成任务之CountDownLatch
- 用 join 或 CountDownLatch 让主线程等待所有子线程完成。
- 并发工具类(一)等待多线程完成的CountDownLatch
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .
- Java后台执行Shell脚本, Java方法不用等待Shell程序执行完成并保证关掉Java程序Shell脚本正常运行
- Java高级篇(四十四)------CountDownLatch、CyclicBarrier和Semaphore
- java高并发之CountDownLatch,CyclicBarrier和join