1. 程式人生 > >使用Spring ThreadPoolTaskExecutor實現多執行緒任務

使用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元件,然後執行緒的引用就十分簡單了,只要把這個執行緒扔進這個執行緒池子就行了

複製程式碼

@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";
    }

複製程式碼

如果不用執行緒處理,那麼使用訊息佇列來處理大資料量操作,檔案操作,或者併發,都可以。