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的好处是可以做到线程复用,并且使用尽量少的线程去执行更多的任务,效率和性能都相当不错。demo代码如下:
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: Quando o número de elementos na fila workQueue ainda não atingir o valor máximo, corePoolSize representa o valor máximo do número de threads na pool;
maximumPoolSize: O número máximo de threads permitido na pool;
keepAliveTime: Se o número de threads na pool exceder corePoolSize, então essas threads que estiverem ociosas por muito tempo devem ser destruídas. keepAliveTime é o tempo máximo de ociosidade dessas threads;
unit: Unidade de tempo de keepAliveTime;
workQueue: Quando o número de threads na pool já atingir corePoolSize, então se as solicitações continuarem a chegar, as tarefas correspondentes às solicitações serão colocadas na fila;
handler: Quando o workQueue estiver cheio e o número de threads na pool atingir maximumPoolSize, neste momento, não há mais recursos disponíveis para processar solicitações, é necessário que o RejectedExecutionHandler faça o tratamento. Rejeitar o processamento ou descartar tarefas, etc.
Processo de execução
Quando não houver solicitações, não há nenhuma thread na pool;
Quando houver solicitações, será criada uma thread até que o número de threads na pool seja igual a corePoolSize;
Se houver muitas solicitações e precisar de mais threads para processar, o ThreadPoolExecutor escolherá colocar as solicitações na fila, sem criar novas threads temporariamente;
Se o workQueue também estiver cheio, o ThreadPoolExecutor continuará a criar threads até que o número de threads seja igual a maximumPoolSize;
Quando o número de threads atingir maximumPoolSize e o workQueue também estiver lento, só podemos jogar as solicitações para o RejectedExecutionHandler para serem tratadas.
Notas
Ao usar ThreadPoolExecutor, é necessário ajustar adequadamente o tamanho dos valores dos parâmetros com base na sua situação de negócios.
Obrigado por ler, espero que isso ajude a todos, obrigado pelo apoio ao site!