您的位置:首页 > 编程语言 > Java开发

Java小并发下短期任务的线程池

2016-03-08 00:00 567 查看
摘要: java并发下异步发短信、邮件的线程池,jdk自带线程池

并发量不大的情况下,如果需要异步完成短期任务,比如发送短信/邮件等,可以考虑使用Jdk自带的线程池,有2种线程池,下面简单分析一下各自适用性:

1)定长线程池:FixedThreadPool

原理:每来一个任务,就会创建一个新线程,直到线程数量达到最大值;如果线程池里的线程都在运行,新来的任务会在队列里排队,直到有空闲的线程。

缺点:需要维护固定数的线程,即使没有任务。致命的缺陷是,底层的无界队列,会无限堆积请求。

2)可缓存线程池:CachedThreadPool

原理:每来一个新的任务,都会去判断线程池里面有没有空闲的线程可以重用,如果一个线程在池里空闲了N秒(默认缓存60S)而没有被重用,将会被线程池移除,释放资源。

缺点:最大线程数Integer.MAX_VALUE,相当于可以无限新增线程,高并发情况下也可能致命。

源码中这样注释:

These pools will typically improve the performance of programs that execute many

short-lived asynchronous tasks.

为什么适用于“短期任务”?

因为短期任务才会很快执行完,线程才会空闲出来,新来的任务才会去重用空闲的线程,如果任务执行时间太长,会导致新来的任务找不到空闲的线程,线程池就会不断地去创建新的线程,服务器一会就扛不住了。

CachedThreadPool使用方法如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 短期任务的可缓存线程池
* * 1,主要用于多并发下“短期任务”的执行
* * 2,对于新的任务,首先会判断有无空闲线程可以重用
* * 3,一个线程执行完,最多会有60S的空闲状态
* * @author wangxu
* * @date 2016
*/
public class ShortTaskExecutor {
/**
* 创建一个jdk自带的可缓存线程池
*/
private static ExecutorService executor = Executors.newCachedThreadPool();

/**
* 私有化构造器
*/
private ShortTaskExecutor() {
}

/**
* 接收Runnable任务,提交到线程池      *      * @param task
*/
public static void execute(Runnable task) {
executor.execute(task);
}

/**
* 测试调用
*/
public static void main(String[] args) {
ShortTaskExecutor.execute(new Runnable() {
@Override
public void run() {
//执行异步任务......
}
});
}
}​


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息