spring中使用多執行緒ThreadPoolTaskExecutor
阿新 • • 發佈:2018-12-10
業務需要,在進行更新的時候會執行一系列操作,或者說更新時會有一個通知.但是沒有使用訊息佇列.所以我想用多執行緒來實現這個功能.最開始沒有使用執行緒池.使用的是內部類的形式實現,程式碼為:
/** * create by : * description: 開啟接單時-查詢是否有還沒配貨的訂單.進行配貨 * create time: 14:59 2018/9/19 */ private class InReceiptThread extends Thread{ private Long dsId; InReceiptThread(Long dsId) { this.dsId = dsId; } @Override public void run() { deliveryStaffService.allotDeliveryStaff(dsId); } }
呼叫程式碼
if("1".equals(workStatus)) {
deliveryStaff.setReceiveType(DeliveryStaff.RECEIVE_TYPE_YES);
new InReceiptThread(Long.parseLong(dsId)).start();
} else {
deliveryStaff.setReceiveType(DeliveryStaff.RECEIVE_TYPE_NO);
}
雖然實現了功能.但是每次都開一個執行緒終究是不合適的,所以查了一下查到了spring自帶的執行緒池ThreadPoolTaskExecutor
改過後的程式碼
springmvc的配置 .
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="${thread.corePoolSize}" /> <property name="maxPoolSize" value="${thread.maxPoolSize}" /> <property name="queueCapacity" value="${thread.queueCapacity}" /> </bean>
.
@Resource(name="threadPoolTaskExecutor")
private ThreadPoolTaskExecutor executor;
/**
* create by :
* description: 開啟接單時-查詢是否有還沒配貨的訂單.進行配貨
* create time: 14:59 2018/9/19
*/
private class InReceiptRunnable implements Runnable{
private Long dsId;
InReceiptRunnable(Long dsId) {
this.dsId = dsId;
}
@Override
public void run() {
deliveryStaffService.allotDeliveryStaff(dsId);
}
}
呼叫:
if("1".equals(workStatus)) {
deliveryStaff.setReceiveType(DeliveryStaff.RECEIVE_TYPE_YES);
executor.execute(new InReceiptRunnable(Long.parseLong(dsId)));
} else {
deliveryStaff.setReceiveType(DeliveryStaff.RECEIVE_TYPE_NO);
}
雖然程式碼比起來下面還多了一丟丟.很少把程式碼改的更多.但是使用了執行緒池,系統的效率肯定會有很大的提高