English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
java ThreadPoolExecutor
前言:
在项目中如果使用发送短信这个功能,一般会把发送短信这个动作变成异步的,因为大部分情况下,短信是否发送成功或失败,都不会影响主流程。当然,发送MQ消息等操作也可以封装成异步操作。
使用基本的New Thread
如果想将一个操作变成异步的,可以直接new thread,然后在run方法中实现业务操作即可。例如:
new Thread(new Runnable() { public void run() { //发送短信、发送MQ消息等 } });
但是这种方式有几个缺点。
1.每次都会new一个线程,执行完毕后销毁,不能复用;
2.如果系统的并发量刚好比较大,需要大量线程,那么这种每次new的方式会抢占资源的。
ThreadPoolExecutor
我们可以使用jdk1.5其中的ThreadPoolExecutor用于封装异步操作。ThreadPoolExecutor的好处是可以实现线程复用,并且使用尽可能少的线程去执行更多的任务,效率和性能都相当不错。示例代码如下:
public class ThreadPool { private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 12, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000), new ThreadPoolExecutor.AbortPolicy()); public static ThreadPoolExecutor getThreadPool() { return threadPool; } }
参数介绍
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { }
corePoolSize:当workQueue队列中的元素还未到达最大值时,corePoolSize表示的池中线程数量的最大值;
maximumPoolSize:线程池中允许的最大线程数;
keepAliveTime:当前池中的线程数如果超过了corePoolSize,那么超出那些线程如果空闲太久了,应该需要销毁的。keepAliveTime就是的是这些线程的最大空闲时间;
unit:keepAliveTime的时间单位;
workQueue:当池中线程数的数量已经达到了corePoolSize,那么如果请求还继续过来,会把请求对应的task放入队列中;
handler:当workQueue满了,池中的线程数又达到了maximumPoolSize,这个时候已经没有多余的资源处理请求了,需要RejectedExecutionHandler来处理。拒绝处理或者丢弃任务等等。
执行过程
当没有请求时,线程池中没有任何线程;
当有请求时,创建线程,一直到池中的线程数等于corePoolSize;
如果请求太多,需要更多的线程来处理的话,ThreadPoolExecutor选择把请求放入队列中,暂时不新建线程;
如果workQueue也满了,ThreadPoolExecutor会继续创建线程,直到线程数量跟maximumPoolSize相等;
当线程数达到maximumPoolSize,同时workQueue也慢了,就只能把请求丢给RejectedExecutionHandler来处理。
备注
Lorsque vous utilisez ThreadPoolExecutor, vous devez définir la taille des paramètres en fonction de votre situation d'affaires.
Merci de lire, j'espère que cela peut aider tout le monde, merci de votre soutien à ce site !