那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?
在java中可以通过线程池来达到这样的效果,本文将介绍一种线程池的使用方法。使用ThreadPoolTaskExecutor来实现线程池,通过spring进行配置,详解如下:
<!-- 配置线程池 -->
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 线程池维护线程的最少数量 -->
<property name="corePoolSize" value="50" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="30000" />
<!-- 线程池维护线程的最大数量 -->
<property name="maxPoolSize" value="200" />
<!-- 线程池所使用的缓冲队列 -->
<property name="queueCapacity" value="1000" />
</bean>
corePoolSize是线程池维护线程的最少数量 ,即线程池中可运行的线程数,超过就需要进入队列中排队,待线程池中有释放线程资源时,再从队列中取出依次执行。
keepAliveSeconds是线程池维护线程所允许的空闲时间,即线程池中线程的可允许空闲时间,超过该时间,则线程关闭。
maxPoolSize是线程池中可维护最大线程数量,超过则不接受任务,抛出异常。
queueCapacity是线程池所使用的缓冲队列,队列大小设置。
代码中实际使用如下:
//获取context中线程池实例
ThreadPoolTaskExecutor threadPool = (ThreadPoolTaskExecutor) context.getBean("threadPool");
//调用execute方法,传入线程,使用了Runnable接口创建线程。
threadPool.execute(new Runnable() {
public void run(){
//TODO
}
});