一、直接調用Spring框架中的ThreadPoolTaskExecutor java
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); //線程池所使用的緩衝隊列 poolTaskExecutor.setQueueCapacity(200); //線程池維護線程的最少數量 poolTaskExecutor.setCorePoolSize(5); //線程池維護線程的最大數量 poolTaskExecutor.setMaxPoolSize(1000); //線程池維護線程所容許的空閒時間 poolTaskExecutor.setKeepAliveSeconds(30000); poolTaskExecutor.initialize();
二、在spring.xml中配置spring
<!-- 配置線程池 --> <bean id ="taskExecutor" class ="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" > <!-- 線程池維護線程的最少數量 --> <span style="white-space:pre"> </span><property name ="corePoolSize" value ="5" /> <!-- 線程池維護線程所容許的空閒時間 --> <span style="white-space:pre"> </span><property name ="keepAliveSeconds" value ="30000" /> <!-- 線程池維護線程的最大數量 --> <span style="white-space:pre"> </span><property name ="maxPoolSize" value ="1000" /> <!-- 線程池所使用的緩衝隊列 --> <span style="white-space:pre"> </span><property name ="queueCapacity" value ="200" /> </bean>
程序裏面獲取:
app
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); ThreadPoolTaskExecutor poolTaskExecutor = (ThreadPoolTaskExecutor)ctx.getBean("taskExecutor");
利用線程池啓動線程:
框架
poolTaskExecutor.execute(new XXXThread());
三、配置解釋spa
當一個任務經過execute(Runnable)方法欲添加到線程池時:線程
一、 若是此時線程池中的數量小於corePoolSize,即便線程池中的線程都處於空閒狀態,也要建立新的線程來處理被添加的任務。code
二、 若是此時線程池中的數量等於 corePoolSize,可是緩衝隊列 workQueue未滿,那麼任務被放入緩衝隊列。xml
三、若是此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,而且線程池中的數量小於maximumPoolSize,建新的線程來處理被添加的任務。隊列
四、 若是此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,而且線程池中的數量等於maximumPoolSize,那麼經過 handler所指定的策略來處理此任務。也就是:處理任務的優先級爲:核心線程corePoolSize、任務隊列workQueue、最大線程 maximumPoolSize,若是三者都滿了,使用handler處理被拒絕的任務。ci
五、 當線程池中的線程數量大於 corePoolSize時,若是某線程空閒時間超過keepAliveTime,線程將被終止。這樣,線程池能夠動態的調整池中的線程數。