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: Wenn die Elemente in der workQueue noch nicht das Maximum erreicht haben, ist corePoolSize der maximale Wert der Anzahl der Threads im Pool;
maximumPoolSize: Die maximale Anzahl von Threads, die der ThreadPool zulassen kann;
keepAliveTime: Wenn die Anzahl der Threads im Pool die corePoolSize übersteigt, sollten die zusätzlichen Threads, die zu lange inaktiv sind, abgebaut werden. keepAliveTime ist die maximale Leerlaufzeit dieser Threads;
unit: Die Zeitединица keepAliveTime;
workQueue: Wenn die Anzahl der Threads im Pool die corePoolSize erreicht hat, wird die Anfrage in die Warteschlange eingefügt, wenn weitere Anfragen eintreffen;
handler: Wenn die workQueue voll ist und die Anzahl der Threads im Pool das maximumPoolSize erreicht hat, gibt es keine zusätzlichen Ressourcen mehr, um Anfragen zu bearbeiten. Es ist erforderlich, den RejectedExecutionHandler zu verwenden, um Anfragen abzulehnen oder zu verwerfen, etc.
Ausführungsprozess
Wenn es keine Anfragen gibt, gibt es im ThreadPool keine Threads;
Wenn es Anfragen gibt, werden Threads erstellt, bis die Anzahl der Threads im Pool corePoolSize erreicht.
Wenn es zu viele Anfragen gibt und mehr Threads zur Verarbeitung erforderlich sind, legt ThreadPoolExecutor die Anfragen in die Warteschlange und erstellt keine neuen Threads.
Wenn auch die workQueue voll ist, wird ThreadPoolExecutor weiterhin Threads erstellen, bis die Anzahl der Threads dem maximumPoolSize entspricht;
Wenn die Anzahl der Threads das maximumPoolSize erreicht hat und die workQueue auch langsam wird, können nur Anfragen an den RejectedExecutionHandler weitergeleitet und bearbeitet werden.
Notizen
Bei der Verwendung von ThreadPoolExecutor ist es erforderlich, die Größe der Parameterwerte angemessen zu bestimmen, abhängig von Ihrer Geschäftslogik.
Vielen Dank für das Lesen, ich hoffe, es hilft Ihnen, danke für Ihre Unterstützung dieser Seite!