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使用方法如下:
并发量不大的情况下,如果需要异步完成短期任务,比如发送短信/邮件等,可以考虑使用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() { //执行异步任务...... } }); } }
相关文章推荐
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- c++线程池实现方法
- C语言实现支持动态拓展和销毁的线程池
- c++实现简单的线程池
- 深入java线程池的使用详解
- java中通用的线程池实例代码
- Java编程中线程池的基本概念和使用
- C#线程池操作方法
- C#线程池用法详细介绍
- C++线程池的简单实现方法
- MySQL的线程池原理学习教程
- 深入解析C++编程中线程池的使用
- Node.js事件循环(Event Loop)和线程池详解
- Android编程自定义线程池与用法示例
- c++实现简单的线程池
- 支持生产阻塞的Java线程池
- Python实现线程池代码分享
- 在Android线程池里运行代码任务实例
- python实现线程池的方法
- nginx线程池源码分析