English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introdução simples ao uso do ThreadPoolExecutor em java

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!

Você também pode gostar