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: عند عدم وصول عناصر workQueue إلى القيمة القصوى، يمثل corePoolSize القيمة القصوى لعدد الأنماط في المجموعة;
maximumPoolSize: عدد الأنماط الأقصى المسموح به في مجموعة التشغيل;
keepAliveTime: إذا كان عدد الأنماط في المجموعة يتجاوز corePoolSize، فإن الأنماط التي تتجاوز يجب أن يتم تدميرها إذا كانت مازالت معطلة لفترة طويلة. keepAliveTime هو وقت العزلة الأقصى لهذه الأنماط;
unit: وحدة وقت keepAliveTime;
workQueue: عند وصول عدد الأنماط في المجموعة إلى corePoolSize، إذا استمرت الطلبات في الوصول، سيتم وضع مهمة الطلب في الصف;
handler: عند مليء workQueue، ووصول عدد الأنماط في المجموعة إلى maximumPoolSize، لا يوجد موارد إضافية للمعالجة الطلبات، ويجب استخدام RejectedExecutionHandler للمعالجة. رفض المعالجة أو التخلص من المهمة وما إلى ذلك.
عملية التشغيل
عند عدم وجود طلب، لا يوجد أي أنماط في مجموعة التشغيل;
عند وجود طلب، يتم إنشاء نموذج حتى يصبح عدد الأنماط في المجموعة متساويًا مع corePoolSize;
إذا كانت هناك الكثير من الطلبات وكانت هناك حاجة إلى المزيد من الأنماط للمعالجة، سيقوم ThreadPoolExecutor بوضع الطلبات في الصف، دون إنشاء أنماط جديدة مؤقتًا;
إذا تم مليء workQueue أيضًا، سيواصل ThreadPoolExecutor إنشاء الأنماط حتى يصبح عدد الأنماط متساويًا مع maximumPoolSize;
عندما يصل عدد الأنماط إلى maximumPoolSize، ويبطئ workQueue أيضًا، يجب فقط إرسال الطلبات إلى RejectedExecutionHandler للمعالجة.
ملاحظة
عند استخدام ThreadPoolExecutor، يجب تحديد حجم المعلمات بشكل مناسب بناءً على حالة عملك.
شكرًا على القراءة، آمل أن تكون قد ساعدتكم، شكرًا لدعمكم لهذا الموقع!