线程池

一:

  应用程序中会出现这种情况:对服务器请求的数目非常大,但是服务器对每个请求处理的时间却很短。如果对这种情况,每个请求都创建一个线程的话,那么创建线程和销毁线程所使用的时间和资源远远大于用户请求的时间和资源,而且创建太多的线程会导致内存过度消耗从而影响性能。

  而线程池很好的解决这个问题,当请求到达时,请求等待一个可用的线程,然后将任务交给线程进行执行,当任务执行完成之后,将线程返还给线程池。java.util.concurrent 是在并发编程中很常用的实用工具包,它包括互斥、信号量、诸如在并发访问下执行得很好的队列和散列表之类集合类以及几个工作队列实现。

 

二:

   Executors类中提供了几种创建线程池的方法:

   newFixedThreadPool创建一个可重用固定线程数的线程池,当任务到来的时候会new一个线程,立马执行;如果所有的线程是活动的,新任务将在队列中等待,直到线程可用。任何线程在执行过程中终止或由于故障关断时,如果需要的话,会以一个新的线程将代替它执行后续的任务。

   newSingleThreadExecutor:创建一个使用单个worker线程操作一个Executor无界队列的线程池。此线程池只有一个线程在工作,如果任务在执行过程中线程终止或故障关机,会有一个新的线程来代替它完成后续任务。此线程池保证所有任务按照提交顺序执行。

   newCachedThreadPool:可根据需要创建新可缓存的线程池,对于执行很多短期异步任务的程序如果有可用线程那将重用以前构造的线程而提高性能,如果没有现有线程可用时,一个新的线程将被创建并添加到池中。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲的线程。

   newScheduledThreadPool:创建一个给定延迟或者定期执行的线程池。

 

三:

  通过源码几种线程池都是通过ThreadPoolExecutor构造出来的,下面对ThreadPoolExecutor构造函数的几个参数做简单的描述:

    corePoolSize - 池中所保存的线程数,包括空闲线程。

    maximumPoolSize - 池中允许的最大线程数。

    keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

    unit - keepAliveTime 参数的时间单位。

    workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。

 

执行的步骤:

   提交一个runnable任务,当poolSize(当前池的大小)<corePoolSize(池中所保存的线程数),会直接做为创建一个线程,立马执行任务。

   当提交的runnable任务数超过了corePoolSize(池中所保存的线程数),会将当前的runable提交到一个块队列中。

   如果块队列是有界队列,当队列满了之后如果poolSize(当前池的大小) < maximumPoolsize(池中允许的最大线程数)时,会尝试创建一个线程来进行救急处理,立马执行对应的runnable任务。

   如果救急方案也无法处理了,就会执行RejectedExecutionHandler操作(进行拒绝、抛弃、抛弃队列最早的、调用运行)。

 

四:简单例子

public abstract class AbstractChannelMessageProcessor {
 /**
  * 线程池
  */
 private  ScheduledExecutorService scheduledExecutorService;
 
 public AbstractChannelMessageProcessor(){
  scheduledExecutorService = Executors.newScheduledThreadPool(1000);
 }
 /**
  * 处理延迟的功能

  * @author wjy
  * @since 2013-12-12
  */
 class CreateTaoKeCtProfitInfo implements Runnable{  
  
  private Map<Long,BizOrderDO> bizOrderIdMap;
  
  CreateTaoKeCtProfitInfo(Map<Long,BizOrderDO> bizOrderIdMap){
   this.bizOrderIdMap = bizOrderIdMap;
  }

  public void run() {
   //进行处理的代码。。。。。。。
  }
  
 }
 /**
  * 运用newScheduledThreadPool来延迟操作(延迟5分钟)
  * @param bizOrderIdMap
  */
 public void createCtProfitInfoForTaoKe(Map<Long,BizOrderDO> bizOrderIdMap){
  scheduledExecutorService.schedule(new CreateTaoKeCtProfitInfo(bizOrderIdMap), 5, TimeUnit.MINUTES);//
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值