注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

多线程池执行异步任务  

2014-03-31 21:34:34|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在软件架构和设计中,会尽可能地将操作异步化,缩短响应时间,提升性能。

将异步任务放入线程池,这是许多人都知道的。但是当异步任务多了之后,如果全放在同一个线程池执行,会出现一些问题:

  • 不同任务因其执行的操作不同,所需时间不同。如果有大量执行时间较久的异步任务,会阻塞那些执行非常快的异步任务,导致原本很快可以完成的异步任务也变慢。
  • 操作本地内容的异步任务和操作远程内容的异步任务。如果放在同一个线程池中,在网络出现故障的情况下,会出现大量的任务积压,导致执行本地内容的异步任务也受影响。

现实生活中,机动车行驶时,会根据行驶的速度划分超车道、快车道、慢车道和应急车道,避免速度慢的车辆阻塞速度快的车辆。

多线程池执行异步任务 - 傲风 - 0与1构筑世界,程序员创造时代

 

同理,将异步任务放入不同的线程池执行,就可以解决上面的两个问题。

threadpool4j是一个实现了多线程池的类库,使用方法如下:

1、获取threadpool4j源码。

git clone https://github.com/aofeng/threadpool4j

2、编译源码生成jar。

进入项目根目录,执行ant脚本:

ant

会生成一个dist目录,下面有两个文件。如:

threadpool4j-1.0.0-src.jar    源码jar
threadpool4j-1.0.0.jar        用于发布的二进制jar

它的依赖类库在lib目录下。有common4j-.jar,log4j-1..jar。

3、配置多线程池。

在应用的CLASSPATH的任意路径(如:应用的classes目录)下新建一个threadpool4j.xml的配置文件,其内容为:

<?xml version="1.0" encoding="UTF-8"?>
<threadpool4j>
    <!-- 至少要有一个线程池default -->
    <pool name="default">
        <corePoolSize>30</corePoolSize>
        <maxPoolSize>150</maxPoolSize>
        <!-- 线程空闲存话的时间。单位:秒 -->
        <keepAliveTime>5</keepAliveTime>
        <workQueueSize>100000</workQueueSize>
    </pool>

    <pool name="other">
        <corePoolSize>10</corePoolSize>
        <maxPoolSize>100</maxPoolSize>
        <keepAliveTime>10</keepAliveTime>
        <workQueueSize>10000</workQueueSize>
    </pool>
</threadpool4j>

4、在应用的启动过程中执行线程池的初始化操作。

ThreadPool.getInstance().init();   // 只需执行一次

输出的日志类似如下:

2014-03-31 21:13:13,925 INFO  initialization 2 thread pool successfully

5、向不同的线程池提交异步任务。

Runnable task1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("执行异步任务1");
    }
};
ThreadPool.getInstance().submit(task1);   // 未指定线程池名称时,任务会提交到名为"default"的线程池执行

Runnable task2 = new Runnable() {
    @Override
    public void run() {
        System.out.println("执行异步任务2");
    }
};
ThreadPool.getInstance().submit(task2, "other");   // 将task2提交到名为"other"的线程池执行

6、在应用关闭时执行线程池的资源释放操作,释放资源的过程会将队列中的异步任务都执行完成。

ThreadPool.getInstance().destroy();

输出的日志类似如下:

2014-03-31 21:16:48,512 INFO  shutdown the thread pool other
2014-03-31 21:16:48,513 INFO  shutdown the thread pool default

<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2014年03月31日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容或者说明原作者和转载地址!

  评论这张
 
阅读(3460)| 评论(13)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017