博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java借助CountDownLatch完成异步回调
阅读量:7076 次
发布时间:2019-06-28

本文共 1702 字,大约阅读时间需要 5 分钟。

hot3.png

public class AsyncDemo {    private static void doSomeTask() {        System.out.println("Hello World");    }    private static void onCompletion() {        System.out.println("All tasks finished");    }    public static void main(String[] args) {        ExecutorService executor = Executors.newCachedThreadPool();        final CountDownLatch latch = new CountDownLatch(2);        executor.execute(new Task(latch));        executor.execute(new Task(latch));        executor.execute(() -> {            try {                latch.await();            } catch (InterruptedException e) {                e.printStackTrace();            }            onCompletion();        });        executor.shutdown();    }    private static class Task implements Runnable {        /**         * CountDownLatch 是JDK提供的一个简单的线程监测工具         * 基于简单的计数,调用countDown()方法表明当前线程已经终止         * 在监测线程中调用await()方法,该方法会一直挂起直到所有其它线程终止         */        private final CountDownLatch latch;        public Task(CountDownLatch latch) {            this.latch = latch;        }        @Override        public void run() {            try {                doSomeTask();            } catch (Exception e) {                e.printStackTrace();            } finally {                latch.countDown();            }        }    }}

这里有两点需要补充:

1.如果你是用main方法启动的线程,这种调用方法是没有问题的,JDK会确保所有线程都终止以后main方法才退出。但是如果main方法不是异步任务的启动者(如JUnit,Spring,Tomcat),一旦启动之后laucher将会失去对线程的控制。如在JUnit中laucher提交完任务后就会被认为所有过程已完成,其它线程会被强行终止。

2.正因为如此,请根据环境使用正确的Executor。比如,在web环境中,应该选用tomcat(或Spring)管理的线程池作为Executor,这样才能确保web应用对于异步任务的整个生命周期具有控制权;如果你选用JDK的线程池有什么后果呢?任务也许可以正常执行,当一旦你终止web-app,正在执行的异步线程并不会被正常kill掉,并由此造成内存泄漏或其它不可预见的后果。

转载于:https://my.oschina.net/u/2541538/blog/829862

你可能感兴趣的文章
综合应用WPF/WCF/WF/LINQ之三十:代码生成器之DBMLToDAL
查看>>
.NET开源项目介绍及资源推荐:数据持久层
查看>>
RAC同单实例物理备库的switchover
查看>>
MultiRow发现之旅(三)- 模板管理器和Table
查看>>
Exchange 2010与Exchange Online混合部署PART 4:混合部署
查看>>
panama项目中字符编码问题解决
查看>>
向C#的String类添加按字节截取字符串的扩展方法
查看>>
Python中元组、列表、字典的遍历和相互转化
查看>>
SmoothWall的小企业应用
查看>>
FOSCommentBundle功能包:设置Doctrine ORM映射(投票)
查看>>
Enterprise Library Step By Step系列(十五):配置应用程序块——设计篇
查看>>
Visio中插入公式
查看>>
对于软件生产能解决到痛点的容器技术就是好!Wise2C睿云智合如何运行
查看>>
SharePoint 2013 状态机工作流之扩展自定义状态
查看>>
物联网下的工控机产业发展迅速 潜力正不断被挖掘
查看>>
云上数据安全,初识数据库审计
查看>>
微信中的video属性设置
查看>>
第一篇:linux系统应用管理之用户的切换
查看>>
haproxy负载均衡
查看>>
MySQL GEO 字段类型说明及案例
查看>>