使用Spring ThreadPoolTaskExecutor實現多線程任務
我們為何使用多線程,之前已經有講過了,為了更快的處理多個任務,分割任務,或者調用多個毫無關聯的第三方服務
其實spring就提供了ThreadPoolTaskExecutor這個類來實現線程池,線程池是啥,可以理解為數據源,或者有一堆線程的池子也行
在spring配置中我們可以寫好如下代碼(大致意思都在注釋中,不多說了,百度也一堆):
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心線程數 --> <property name="corePoolSize" value="5" /> <!-- 最大線程數 --> <property name="maxPoolSize" value="10" /> <!-- 隊列最大長度 >=mainExecutor.maxSize --> <property name="queueCapacity" value="25" /> <!-- 線程池維護線程所允許的空閑時間 --> <property name="keepAliveSeconds" value="3000" /> <!-- 線程池對拒絕任務(無線程可用)的處理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,調用者的線程會執行該任務,如果執行器已關閉,則丟棄. --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> </bean>
然後定義一個component組件,然後線程的引用就十分簡單了,只要把這個線程扔進這個線程池子就行了
@Componentpublic class FileCutter { @Autowired private TaskExecutor taskExecutor; public void filesMng(String path, String fileName) { this.taskExecutor.execute(new CutFilesThread(path,fileName)); } private class CutFilesThread implements Runnable { private String path; private String fileName; private CutFilesThread(String path, String fileName) { super(); this.path = path; this.fileName = fileName; } @Override public void run() { System.out.println("barry... run...");// display(path, fileName); } }
最後在你所需要的地方就可以調用這個組件了,不論是service還是controller都行
@Autowired private FileCutter fileCutter; @RequestMapping("/cut") @ResponseBody public Object cut(){ fileCutter.filesMng("your path", "your fileName"); return "success"; }
如果不用線程處理,那麼使用消息隊列來處理大數據量操作,文件操作,或者並發,都可以。
尚自習 | 程序員的進階平台 itzixi.com
推薦閱讀:
※關於如何構建一個線程安全的數組引發的思考
※多線程效率測試
※線程、進程、超線程
※CountDownLatch實現計算線程阻塞
TAG:多線程 |