SPRINGのスレッド池ThreadPoolTaskExector
一、ThreadPoolTaskExector配置
二、execute(Runnable)方法の実行過程この時、スレッド池の数がcorePoolSizeより小さい場合、スレッドプールのスレッドがアイドル状態であっても、追加されたタスクを処理するために新しいスレッドを作成します. この時点でスレッド池の数がcorePoolSizeに等しいが、バッファキューのworkQueが満杯していない場合、ジョブはバッファキューに入れられる. この時スレッドの池の数がcorePoolSizeより大きい場合、バッファキューのworkQueがいっぱいになり、スレッドの池の数がmaximPoolSizeより小さい場合、追加されたタスクを処理するために新しいスレッドを建設する. この時スレッド池の数がcorePoolSizeよりも大きい場合、バッファキューworkQueがいっぱいになり、スレッド池の数がmaximPoolSizeに等しい場合、handlerによって指定されたポリシーによって処理される.すなわち、処理タスクの優先度は、コアスレッドcorePoolSize、タスクキューworkQue、最大スレッドmaximPoolSizeであり、3つが満杯になったら、handlerを使って拒否されたタスクを処理することである. スレッド池中のスレッド数がcorePoolSizeより大きい場合、あるスレッドの空き時間がkeep Alive Timeを超えると、スレッドは終了される.このように、スレッド池は、プール内のスレッド数を動的に調整することができる. 三、コード例
<bean id ="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
<property name ="corePoolSize" value ="5" />
<property name ="keepAliveSeconds" value ="300" />
<property name ="maxPoolSize" value ="10" />
<property name ="queueCapacity" value ="25" />
</bean>
プロパティフィールドの説明:corePoolSize:スレッド池のメンテナンススレッドの最小数keepAlive Secondsスレッドのメンテナンススレッドによって許可される空き時間maxPoolSizeスレッドのメンテナンススレッドの最大数queue Capacityスレッド池で使用されるバッファキュー二、execute(Runnable)方法の実行過程
ApplicationContext ctx = new
ClassPathXmlApplicationContext("applicationContext.xml");
ThreadPoolTaskExecutor poolTaskExecutor = (ThreadPoolTaskExecutor)
ctx.getBean("taskExecutor");
Thread udpThread = new Thread(udp);
poolTaskExecutor.execute(udpThread);
:
int count = poolTaskExecutor.getActiveCount();
logger.debug("[x] - now threadpool active threads totalNum : " +count);