`

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

    博客分类:
  • java
 
阅读更多

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

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<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 concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    CountDownLatch是Java并发编程中一个重要的工具类,用于协调多线程间的同步。它由Java并发包`java.util.concurrent`提供,主要用于解决一种场景:在主控线程等待多个子线程完成各自任务后再继续执行的情况。下面我们...

    CountDownLatch、Semaphore等4大并发工具类详解

    CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。其原理是通过一个计数器来实现的,计数器的初始值为需要等待线程的数量。当主线程调用 CountDownLatch 的 await() ...

    java多线程案例——未完成

    Java多线程是Java编程中的一个重要领域,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    - 使用 CyclicBarrier 初始化 N 个线程,这些线程需要共同完成一个任务,只有当所有线程都准备好了之后,它们才能一起开始执行。 **实践案例:** 假设我们有一个复杂的任务,需要分阶段完成,而且每个阶段都需要...

    java多线程、锁的教程跟案例

    - 实现Callable接口:创建一个实现Callable接口的类,重写call()方法,然后通过FutureTask包装Callable实例,最后创建Thread启动。 2. **线程状态** - 新建(New):线程被创建但未启动。 - 可运行(Runnable)...

    java并发之并发工具类

    CountDownLatch 是一种同步工具,允许一个或多个线程一直等待,直到其他线程完成操作。它的作用是允许 1 或 N 个线程等待其他线程完成执行。CountDownLatch 的实现是通过一个计数器来实现的,当我们在 new 一个 ...

    java10个线程按照顺序打印1-100

    5. **CountDownLatch**:`java.util.concurrent.CountDownLatch`是另一种同步辅助类,它允许一个或多个线程等待其他线程完成操作。在顺序打印的例子中,可以设置计数器为100,每个线程打印一个数字后减少计数器,...

    JAVA中锁的解决方案.docx

    在 JAVA 中,乐观锁并没有确定的方法或者关键字,它只是一个处理的流程、策略。我们可以通过在检索数据时,将数据的版本号(version)或者最后更新时间一并检索出来,然后在执行 update 操作时,比较版本号或最后...

    java多线程学习必备_快速理解java多线程(附代码和运行结果截图和解释文档)

    1. **CountDownLatch**:用于计数器,允许一个或多个线程等待其他线程完成操作。 2. **CyclicBarrier**:循环屏障,让一组线程到达一个屏障(即同步点)时被阻塞,直到最后一个线程到达后所有线程一起继续。 3. **...

    JAVA多线程的实例

    最后,线程优先级是另一个重要概念,Java中的线程优先级范围从`Thread.MIN_PRIORITY`(1)到`Thread.MAX_PRIORITY`(10),默认优先级是`Thread.NORM_PRIORITY`(5)。但是,线程优先级并不保证绝对的执行顺序,只是...

    《软件开发基础(Java)》实验报告-Java多线程编程.docx

    在本实验报告中,我们关注的是Java多线程编程,这是Java编程中一个重要的主题,尤其是在并发处理和高性能系统设计中。线程是操作系统分配CPU时间的基本单位,它允许一个程序内部同时执行多个任务,提高了应用程序的...

    Java并发编程常识-梁飞.rar

    CountDownLatch允许一个或多个线程等待其他线程完成操作;CyclicBarrier则允许一组线程等待彼此到达某个屏障点;Semaphore可以用来限制同时访问特定资源的线程数量。 此外,Java并发编程还需要理解死锁、活锁和饥饿...

    聊聊锁的那些事

    而CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。使用这两个工具类可以构建出复杂多变的同步场景。 总结来说,锁是并发编程中解决资源竞争问题的重要...

    Java编程之高并发核心源码

    它们可以帮助线程在特定条件满足时进行同步,例如等待一组任务完成(CyclicBarrier)或等待一定数量的任务完成(CountDownLatch)。 总的来说,Java的高并发核心源码涉及到线程管理、同步机制、并发数据结构、内存...

    Java 模拟线程并发

    最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...

    java 7并发编程实战手册 源码

    `CountDownLatch`允许一个或多个线程等待其他线程完成操作,常用于启动并发测试;`CyclicBarrier`则让一组线程等待彼此到达一个屏障点后一起继续执行,适合多线程协作场景;`Phaser`是更为灵活的同步辅助类,可以...

    java多线程核心编程技术

    `CountDownLatch`允许一个或多个线程等待其他线程完成操作。构造函数设置计数器的初始值,每当一个参与者准备就绪,就调用`countDown()`方法将计数器减1;当计数器的值变为0时,所有等待的线程都将被释放。 ##### ...

    java并发.rar

    CountDownLatch和CyclicBarrier是协调多个线程的同步工具,前者允许一个或多个线程等待其他线程完成操作,后者则允许一组线程等待所有线程到达屏障点后一起继续执行。 此外,Java并发编程还涉及到线程安全的数据...

    【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip

    `Semaphore`信号量控制对有限资源的访问,`CountDownLatch`计数器用于等待一组线程完成操作,`CyclicBarrier`循环栅栏允许一组线程等待彼此到达某个点后再继续执行,而`Phaser`是Java 7引入的更高级的同步工具。...

    计算机后端-Java-Java高并发从入门到面试教程-并发基础.zip

    比如,Semaphore信号量可以控制同时访问特定资源的线程数量,CountDownLatch可以用于线程间的协作,让某个线程等待其他线程完成后再继续执行,CyclicBarrier则允许一组线程等待所有线程到达某个屏障点后再继续执行。...

Global site tag (gtag.js) - Google Analytics