spring 配置 執行緒池並使用 springtest 進行測試
阿新 • • 發佈:2019-01-10
在 applicationContext.xml 中配置spring執行緒池:
<!-- 包路徑掃描 --> <context:component-scan base-package="spring.task"/> <!-- Spring執行緒池 --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!--核心執行緒數 --> <property name="corePoolSize" value="5" /> <!-- 執行緒池維護執行緒的最大數量 --> <property name="maxPoolSize" value="10" /> <!-- 允許的空閒時間, 預設60秒 --> <property name="keepAliveSeconds" value="60" /> <!-- 任務佇列 --> <property name="queueCapacity" value="50" /> <!-- 執行緒超過空閒時間限制,均會退出直到執行緒數量為0 --> <property name="allowCoreThreadTimeOut" value="true"/> <!-- 對拒絕task的處理策略 --> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy"/> </property> </bean>
當一個新任務來臨時: 1)如果此時執行緒池中的數量小於corePoolSize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務; 2)如果此時執行緒池中的數量等於corePoolSize,但是緩衝佇列workQueue未滿,那麼任務被放入緩衝佇列; 3)如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量小於maxPoolSize,建新的執行緒來處理被新增的任務; 4)如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量等於maxPoolSize,那麼通過handler所指定的策略來處理此任務; 5)當執行緒池中的執行緒數量大於corePoolSize時,如果某執行緒空閒時間超過keepAliveTime,執行緒將被終止,如果allowCoreThreadTimeOut為false,則執行緒數量維持在corePoolSize, 如果為true,則執行緒數量可最低降至0;
下面是 springtest 的實現方式:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) public class AsyncTask { @Autowired private ThreadPoolTaskExecutor executor; // @PostConstruct 註解需要使用,否則不能成功看到輸出 @PostConstruct public void testAsycTask() { for (int i = 0; i < 10; i++) { executor.execute(new Runnable() { public void run() { asyncTask(); } }); } } // 這裡需要設定為 public @Test public void asyncTask() { System.out.println("---" + Thread.currentThread().getName()); } }
成功: