java锁之CountDownLatch(等待最后一个完成)

阅读更多

线程同步工具,允许一个线程(或者多个线程)等待其他所有线程执行完毕后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。期待最后一个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() {

		                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(等待最后一个完成))