线程池为线程生命周期开销问题和资源有余问题提供了解决方案。通过对多个工作重用线程,线程创立的开销被摊派到了多个工作上。其益处是,因为在申请达到时线程曾经存在,所以无心中也打消了线程创立所带来的提早。这样,就能够立刻为申请服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当申请的数目超过某个阈值时,就强制其它任何新到的申请始终期待,直到取得一个线程来解决为止,从而能够避免资源有余。
应用spring治理线程池的应用
1、创立线程池的配置信息threads.properties
####业务线程池配置#####是否启用自定义线程池。true时启动,以下参数失效handler.threads.custom=false#外围线程数handler.threads.corePoolSize=20#最大线程数handler.threads.maximumPoolSize=1000#闲暇线程存活工夫,单位秒handler.threads.keepAliveTime=100#工作队列大小,为0是无限大handler.threads.workQueue=0
2、创立 线程池 配置,ThreadsPoolConfig.java
package com.hk.core.concurrent;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;/** * 线程池 配置 */@Componentpublic class ThreadsPoolConfig { /** * 是否开启自定义线程池 */ @Value("${handler.threads.custom}") private boolean custom; /** * 外围线程数 */ @Value("${handler.threads.corePoolSize}") private int corePoolSize; /** * 线程池最大线程数 */ @Value("${handler.threads.maximumPoolSize}") private int maximumPoolSize; /** * 闲暇线程存活工夫(对外围线程有效) */ @Value("${handler.threads.keepAliveTime}") private long keepAliveTime; /** * 工作队列大小,0时为无界队列 */ @Value("${handler.threads.workQueue}") private int workQueue; public boolean isCustom() { return custom; } public void setCustom(boolean custom) { this.custom = custom; } public int getCorePoolSize() { return corePoolSize; } public void setCorePoolSize(int corePoolSize) { this.corePoolSize = corePoolSize; } public int getMaximumPoolSize() { return maximumPoolSize; } public void setMaximumPoolSize(int maximumPoolSize) { this.maximumPoolSize = maximumPoolSize; } public long getKeepAliveTime() { return keepAliveTime; } public void setKeepAliveTime(long keepAliveTime) { this.keepAliveTime = keepAliveTime; } public int getWorkQueue() { return workQueue; } public void setWorkQueue(int workQueue) { this.workQueue = workQueue; } }
3、创立 线程池 处理器治理线程 HandlerThreadsPool.java
package com.hk.core.concurrent;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import javax.annotation.PreDestroy;/** * 线程管理器 */public class HandlerThreadsPool { public ExecutorService executorService; public HandlerThreadsPool() { // TODO Auto-generated constructor stub this.executorService=Executors.newCachedThreadPool(); } public HandlerThreadsPool(ThreadsPoolConfig config) { // TODO Auto-generated constructor stub if(config.isCustom()){ BlockingQueue<Runnable> queue=null; if(config.getWorkQueue()>0){ queue=new LinkedBlockingQueue<Runnable>(config.getWorkQueue()); // 个别应用 LinkedBlockingQueue 队列 }else{ queue=new LinkedBlockingQueue<Runnable>(); } // 配置线程池信息 this.executorService=new ThreadPoolExecutor( config.getCorePoolSize(), config.getMaximumPoolSize(), config.getKeepAliveTime(), TimeUnit.SECONDS, queue, new ThreadPoolExecutor.AbortPolicy()//回绝策略,工作队列满后,新的工作将被抛弃,并抛出异样 ); }else{ this.executorService=Executors.newCachedThreadPool(); } } /* * 创立线程,对线程处理事件 */ public void execute(Runnable runnable){ executorService.execute(runnable); } /* * 对象销毁时,销毁线程 */ @PreDestroy public void stop() { executorService.shutdown(); } }
4、应用线程池
package com.hk.core.concurrent;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class MsgHandler implements Runnable{ @Autowired private ThreadsPoolConfig config; // 注入 配置 @Override public void run() { // do 这里 写 解决的逻辑 System.out.println("创立线程 处理事务...."); } @PostConstruct public void loadThreadsPool(){ // 初始化 线程池 HandlerThreadsPool handlerThreadsPool=new HandlerThreadsPool(config); //调用线程池,创立线程 。处理事件 handlerThreadsPool.execute(new MsgHandler()); }}