使用Spring ThreadPoolTaskExecutor實現多執行緒任務
阿新 • • 發佈:2019-01-04
我們為何使用多執行緒,之前已經有講過了,為了更快的處理多個任務,分割任務,或者呼叫多個毫無關聯的第三方服務
其實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元件,然後執行緒的引用就十分簡單了,只要把這個執行緒扔進這個執行緒池子就行了
複製程式碼
@Component
public 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";
}
複製程式碼
如果不用執行緒處理,那麼使用訊息佇列來處理大資料量操作,檔案操作,或者併發,都可以。