SPRINGのスレッド池ThreadPoolTaskExector


一、ThreadPoolTaskExector配置
<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)方法の実行過程
  • この時、スレッド池の数がcorePoolSizeより小さい場合、スレッドプールのスレッドがアイドル状態であっても、追加されたタスクを処理するために新しいスレッドを作成します.
  • この時点でスレッド池の数がcorePoolSizeに等しいが、バッファキューのworkQueが満杯していない場合、ジョブはバッファキューに入れられる.
  • この時スレッドの池の数がcorePoolSizeより大きい場合、バッファキューのworkQueがいっぱいになり、スレッドの池の数がmaximPoolSizeより小さい場合、追加されたタスクを処理するために新しいスレッドを建設する.
  • この時スレッド池の数がcorePoolSizeよりも大きい場合、バッファキューworkQueがいっぱいになり、スレッド池の数がmaximPoolSizeに等しい場合、handlerによって指定されたポリシーによって処理される.すなわち、処理タスクの優先度は、コアスレッドcorePoolSize、タスクキューworkQue、最大スレッドmaximPoolSizeであり、3つが満杯になったら、handlerを使って拒否されたタスクを処理することである.
  • スレッド池中のスレッド数がcorePoolSizeより大きい場合、あるスレッドの空き時間がkeep Alive Timeを超えると、スレッドは終了される.このように、スレッド池は、プール内のスレッド数を動的に調整することができる.
  • 三、コード例
    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);