java - 异步操作设计问题
PHP中文网
PHP中文网 2017-04-17 17:22:05
[Java讨论组]

我们项目有这样的代码,个人感觉不是很友好.
比如一个service类,里面有个操作可能需要异步化,那么我们自己的项目大概是这样的,为代码如下:

public class XXXServiceImpl implements XXXService{
    @Resource
    private XXXDao xxxDao;
    private LinkedBlockingDeque<X> dataQueue;

    @PostConstruct
    private synchronized void init() {
        if(dataQueue == null) {
            dataQueue = new LinkedBlockingDeque<X>();
            Thread updateThread = new Thread(new Runnable() {
                
                @Override
                public void run() {
                    while(true){
                        List<X> l = new ArrayList();
                        X xxx =  dataQueue.take();
                        l.add(xxx);
                        if(l.size == 200){
                          xxxDao.batchInsert(l);
                          l.clear();
                        }
                        //do something
                    }
             };
             updateThread.setDaemon(true);
             updateThread.setName("xxxx");
             updateThread.start();
         }
    }
    
    public void saveData(X xxx){
        dataQueue.add(xxx);
    }
}

然后每个这样的service都这样处理异步的.

===================================================================

个人觉得应该集中处理这种需要异步处理的情况,比如一个线程池,每个任务绑定一个callback处理方法,从线程池里面取出需要处理的异步任务,然后调用callback进行处理.
这样当重启应用的时候,还可以添加一个hook,shutdown这个线程池,等待所有任务都处理完后,才退出进程.

不知道大家的公司怎么处理的,是否也是有我们这样的代码呢?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(8)
阿神

使用消息队列。

迷茫

jdk6 提供了,FutureTask 多线程异步处理。
jdk7 提供了,Fork/Join 都应该能满足你的要求。

PHP中文网

我们目前没有这样的需求,有些公司是利用了缓存和数据库,应用程序写缓存,有后台程序从缓存同步到数据库

大众点评的zebra-dao 就是一个异步的dao实现,方法和你说的类似。

怪我咯

我们目前没有这样的需求,有些公司是利用了缓存和数据库,应用程序写缓存,有后台程序从缓存同步到数据库

大众点评的zebra-dao 就是一个异步的dao实现,方法和你说的类似。

怪我咯

直接用Spring的@Async

PHP中文网

如果是后台的话,还是用消息队列对其进行解耦吧
使用线程或线程池不是说不可以,但是debug麻烦,逻辑也容易出错。

大家讲道理

这样做应该会导致异步阻塞吧

大家讲道理

关于线程池:

ExecutorService pool = Executors.newSingleThreadExecutor(); //单线程服务
ExecutorService pool = Executors.newFixedThreadPool(10);  //10个线程的线程池

关于callback : 可以参考 CallableFuture,通过它们可以在任务执行完毕之后得到任务执行结果.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号