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

java ThreadPoolExecutor使用方法简单介绍

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 gli elementi nella coda workQueue non hanno raggiunto il valore massimo, corePoolSize rappresenta il valore massimo del numero di thread nel pool;
maximumPoolSize: Il numero massimo di thread permessi nel pool;
keepAliveTime: Se il numero di thread nel pool supera corePoolSize, allora i thread in eccesso che sono rimasti inattivi per troppo tempo dovrebbero essere distrutti. keepAliveTime è il tempo massimo di inattività di questi thread;
unit: L'unità di tempo per keepAliveTime;
workQueue: Quando il numero di thread nel pool ha raggiunto corePoolSize, se arrivano ulteriori richieste, le corrispondenti task vengono messe in coda;
handler: Quando la workQueue è piena e il numero di thread nel pool ha raggiunto maximumPoolSize, non ci sono risorse aggiuntive disponibili per gestire le richieste, è necessario che RejectedExecutionHandler gestisca. Rifiutare la gestione o eliminare il task, ecc.

Processo di esecuzione

Quando non ci sono richieste, non ci sono thread nel pool;

Quando ci sono richieste, viene creato un thread fino a quando il numero di thread nel pool è uguale a corePoolSize;

Se ci sono troppe richieste e si ha bisogno di più thread per gestirle, ThreadPoolExecutor sceglie di mettere le richieste in coda e non creare nuovi thread temporaneamente;

Se anche la workQueue è piena, ThreadPoolExecutor continuerà a creare thread fino a quando il numero di thread è uguale a maximumPoolSize;

Quando il numero di thread raggiunge maximumPoolSize e contemporaneamente la workQueue è lenta, è necessario passare le richieste a RejectedExecutionHandler per la gestione.

Nota

Quando si utilizza ThreadPoolExecutor, è necessario specificare in modo appropriato la dimensione dei valori dei parametri in base alla propria situazione aziendale.

Grazie per aver letto, spero di essere stato d'aiuto, grazie per il supporto al nostro sito!