自定義異步任務管理器和線程

import com.lancoo.common.utils.Threads;
import com.lancoo.common.utils.spring.SpringUtils;import java.util.TimerTask;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/*** 異步任務管理器* * @author lancoo*/
public class AsyncManager
{/*** 操作延遲10毫秒*/private final int OPERATE_DELAY_TIME = 10;/*** 異步操作任務調度線程池*/private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");/*** 單例模式*/private AsyncManager(){}private static AsyncManager me = new AsyncManager();public static AsyncManager me(){return me;}/*** 執行任務* * @param task 任務*/public void execute(TimerTask task){executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);}/*** 停止任務線程池*/public void shutdown(){Threads.shutdownAndAwaitTermination(executor);}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.concurrent.*;/*** 線程相關工具類.* * @author lancoo*/
public class Threads
{private static final Logger logger = LoggerFactory.getLogger(Threads.class);/*** sleep等待,單位為毫秒*/public static void sleep(long milliseconds){try{Thread.sleep(milliseconds);}catch (InterruptedException e){return;}}/*** 停止線程池* 先使用shutdown, 停止接收新任務并嘗試完成所有已存在任務.* 如果超時, 則調用shutdownNow, 取消在workQueue中Pending的任務,并中斷所有阻塞函數.* 如果仍然超時,則強制退出.* 另對在shutdown時線程本身被調用中斷做了處理.*/public static void shutdownAndAwaitTermination(ExecutorService pool){if (pool != null && !pool.isShutdown()){pool.shutdown();try{if (!pool.awaitTermination(120, TimeUnit.SECONDS)){pool.shutdownNow();if (!pool.awaitTermination(120, TimeUnit.SECONDS)){logger.info("Pool did not terminate");}}}catch (InterruptedException ie){pool.shutdownNow();Thread.currentThread().interrupt();}}}/*** 打印線程異常信息*/public static void printException(Runnable r, Throwable t){if (t == null && r instanceof Future<?>){try{Future<?> future = (Future<?>) r;if (future.isDone()){future.get();}}catch (CancellationException ce){t = ce;}catch (ExecutionException ee){t = ee.getCause();}catch (InterruptedException ie){Thread.currentThread().interrupt();}}if (t != null){logger.error(t.getMessage(), t);}}
}
import com.lancoo.common.utils.Threads;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;/*** 線程池配置***/
@Configuration
public class ThreadPoolConfig
{// 核心線程池大小private int corePoolSize = 50;// 最大可創建的線程數private int maxPoolSize = 200;// 隊列最大長度private int queueCapacity = 1000;// 線程池維護線程所允許的空閑時間private int keepAliveSeconds = 300;@Bean(name = "threadPoolTaskExecutor")public ThreadPoolTaskExecutor threadPoolTaskExecutor(){ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setMaxPoolSize(maxPoolSize);executor.setCorePoolSize(corePoolSize);executor.setQueueCapacity(queueCapacity);executor.setKeepAliveSeconds(keepAliveSeconds);// 線程池對拒絕任務(無線程可用)的處理策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}/*** 執行周期性或定時任務*/@Bean(name = "scheduledExecutorService")protected ScheduledExecutorService scheduledExecutorService(){return new ScheduledThreadPoolExecutor(corePoolSize,new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),new ThreadPoolExecutor.CallerRunsPolicy()){@Overrideprotected void afterExecute(Runnable r, Throwable t){super.afterExecute(r, t);Threads.printException(r, t);}};}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.annotation.PreDestroy;/*** 確保應用退出時能關閉后臺線程** @author lancoo*/
@Component
public class ShutdownManager
{private static final Logger logger = LoggerFactory.getLogger("sys-user");@PreDestroypublic void destroy(){shutdownAsyncManager();}/*** 停止異步執行任務*/private void shutdownAsyncManager(){try{logger.info("====關閉后臺任務任務線程池====");AsyncManager.me().shutdown();}catch (Exception e){logger.error(e.getMessage(), e);}}
}

調用異步時直接使用

或者直接在方法上使用異步注解@Async

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213910.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統大會 openEuler Summit 2023即將召開,亮點不容錯過

【12月11日&#xff0c;北京】數字化、智能化浪潮正奔涌而來。操作系統作為數字基礎設施的底座&#xff0c;已經成為推動產業數字化、智能化發展的核心力量&#xff0c;為數智未來提供無限可能。12月15-16日&#xff0c;以“崛起數字時代 引領數智未來”為主題的操作系統大會 &…

〖Python網絡爬蟲實戰?〗- 極驗滑塊介紹(四)

訂閱&#xff1a;新手可以訂閱我的其他專欄。免費階段訂閱量1000 python項目實戰 Python編程基礎教程系列&#xff08;零基礎小白搬磚逆襲) 說明&#xff1a;本專欄持續更新中&#xff0c;訂閱本專欄前必讀關于專欄〖Python網絡爬蟲實戰〗轉為付費專欄的訂閱說明作者&#xff1…

【ArcGIS Pro微課1000例】0049:根據坐標快速定位(創建點位)的常見方法

文章目錄 一、轉到XY1. 閃爍位置2. 平移3. 標記位置二、定位1. 坐標定位2. 添加到圖形3. 添加至要素類三、添加XY坐標四、創建點要素一、轉到XY 舉例:經緯度坐標:113.2583286東, 23.1492340北 。 1. 閃爍位置 輸入坐標,點擊閃爍位置工具,即可在對應的位置出現一個綠色閃爍…

SQL注入漏洞利用

預計更新SQL注入概述 1.1 SQL注入攻擊概述 1.2 SQL注入漏洞分類 1.3 SQL注入攻擊的危害 SQLMap介紹 2.1 SQLMap簡介 2.2 SQLMap安裝與配置 2.3 SQLMap基本用法 SQLMap進階使用 3.1 SQLMap高級用法 3.2 SQLMap配置文件詳解 3.3 SQLMap插件的使用 SQL注入漏洞檢測 4.1 SQL注入…

shiro入門demo

搭建springboot項目&#xff0c;引入以下依賴&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--單元測試--><depe…

集的增刪操作

集是可以修改的&#xff0c;增加元素可以用add和update函數。刪除可以用pop、discard、remove等函數。 1 增加集里的元素 add函數的參數視為一個整體插入到集里&#xff0c;而update函數傳入的參數是把要傳入的元素拆分&#xff0c;做為個體傳入到集合中。 s set("hell…

.9.png的創建

1、創建.9.png 選中圖片&#xff0c;右擊&#xff0c;選擇Create 9-Patch file&#xff0c;點擊確定會生成一個xxx.9.png的圖片 2、繪制拉伸區域 在圖片的最外邊界繪制拉伸區域&#xff0c;按住鼠標左鍵不放&#xff0c;繪制完成后保存就可以使用了。繪制結果示意如下&…

phpstudy小皮(PHP集成環境)下載及使用

下載 https://www.xp.cn/download.html直接官網下載即可&#xff0c;下載完解壓是個.exe程序&#xff0c;直接點擊安裝就可以&#xff0c;它會自動在D盤目錄為D:\phpstudy_pro 使用 phpMyAdmin是集成的數據庫可視化&#xff0c;這里需要下載一下&#xff0c;在軟件管理-》網站程…

OPPO怎么錄屏?教程來了,讓你成為錄屏達人

“有人知道OPPO怎么錄屏嗎&#xff0c;前陣子剛買的OPPO手機&#xff0c;用起來感覺挺流暢的&#xff0c;功能也很齊全&#xff0c;最近因為工作原因&#xff0c;需要用到錄屏功能&#xff0c;但是我不知道怎么打開&#xff0c;就想問問大伙&#xff0c;OPPO怎么錄屏呀。” 在…

Redis分片集群一步一步全過程搭建

文章目錄 Redis搭建分片集群1. 搭建的分片集群結構2.準備實例和配置&#xff08;1&#xff09;創建目錄&#xff08;2&#xff09;創建配置文件&#xff08;3&#xff09;將這個文件拷貝到每個目錄下&#xff08;4&#xff09;修改每個目錄下的redis.conf&#xff0c;將其中的6…

Yocto 還是 Buildroot,構建自定義嵌入式系統時,您會選擇哪一種?

假設您正在采用集成平板開發新一代大型智能微波爐。這個創意不錯吧&#xff01;現在&#xff0c;您需要構建自定義操作系統&#xff0c;在保證不會燒焦食物&#xff08;更不要燒毀房屋哦&#xff09;的前提下&#xff0c;輔助管理各項事務。除此之外&#xff0c;您還需要創建一…

px? pt? dp? em?rem?vw?vh?ch?ex?這些單位你了解嗎?

目錄 前言 一、常見單位 1、px單位 2、dp單位 3、pt單位 4、百分比% 5、em單位 6、rem單位 7、vw和vh單位 8、ch、ex單位 二、如何換算 1、 pt和px換算 2、px和dp換算 3、em和px換算 4、rem和px換算 三、總結 前言 前端開發在日常設計中除了最常用的 px 以外&…

第二十八章 控制到 XML 模式的映射 - 流類到 XML 類型的映射

文章目錄 第二十八章 控制到 XML 模式的映射 - 流類到 XML 類型的映射將集合屬性映射到 XML 模式 第二十八章 控制到 XML 模式的映射 - 流類到 XML 類型的映射 如果類或屬性基于流&#xff0c;則它將投影為 XML 類型&#xff0c;如下表所示&#xff1a; IRIS 流的 XML 類型 …

使用BeautifulSoup 4和Pillow合并網頁圖片到一個PDF:一種高效的方式來處理網頁圖像

背景 ? 網頁上的培訓材料&#xff0c;內容全是PPT頁面圖片。直接通過瀏覽器打印&#xff0c;會存在只打印第一頁&#xff0c;并且把瀏覽器上無效信息也打印出來情況。但目標是希望將頁面圖片全部打印為pdf形式。 實現方案 利用網頁“另存為”&#xff0c;將頁面內所有圖片資…

官宣!「灣區之光群星演唱會」拉開2024新年音樂華麗序幕!

萬眾期待&#xff0c;群星薈萃&#xff01;青春寶安時尚灣區——灣區之光群星演唱會即將在2024年1月5日閃耀亮相深圳寶安。 華語歌壇巨星天后齊聚一堂&#xff0c;攜手多位實力唱將&#xff0c;共同呈現一場無與倫比的演唱會盛宴&#xff01;在深情而又充滿力量的歌聲之中&…

Linux修復磁盤壞道,重新掛載硬盤

修復磁盤 掛載報錯&#xff1a; [rootlocalhost ~]$ mount /dev/sdb /mnt/mydevmount: /dev/sdb is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sdb,missing codepage or helper program, or other errorIn some cases …

15、lambda表達式、右值引用、移動語義

前言 返回值后置 auto 函數名 (形參表) ->decltype(表達式) lambda表達式 lambda表達式的名稱是一個表達式 (外觀類似函數)&#xff0c;但本質絕非如此 語法規則 [捕獲表] (參數表) 選項 -> 返回類型 { 函數體; }lambda表達式的本質 lambda表達式本質其實是一個類…

textarea文本框回車enter的時候自動提交表單,根據內容自動高度

切圖網近期一個bootstrap5仿chatgpt頁面的項目遇到的&#xff0c;textarea文本框回車enter的時候自動提交表單&#xff0c;根據內容自動高度&#xff0c;代碼如下&#xff0c;親測可用。 <textarea placeholder"Message ChatGPT…" name"" rows"&q…

TypeScript 第五節:條件語句

一、TypeScript 中常用的條件語句 TypeScript 的條件語句與 JavaScript 的條件語句類似&#xff0c;包括 if 語句、if...else 語句、switch 語句等。 1、if 語句 if 語句用于判斷指定條件是否為 true&#xff0c;如果是 true&#xff0c;則執行一段代碼塊。 示例&#xff1a;…

命名空間this_thread

命名空間 - this_thread 在C11中不僅添加了線程類&#xff0c;還添加了一個關于線程的命名空間std::this_thread&#xff0c;在這個命名空間中提供了四個公共的成員函數&#xff0c;通過這些成員函數就可以對當前線程進行相關的操作了。 1.get_id() 調用命名空間std::this_t…