对java线程池的一点认识。

public static ThreadPoolExecutor OperateDataThreadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),new ThreadPoolExecutor.CallerRunsPolicy());

上面是在项目里用到的一个java线程池,有些地方理解的迷迷糊糊。今天再学习了一下。做点记录。

 1、如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程

2、如果池中的线程数>corePoolSize 并且 <maximumPoolSize,而又有空闲线程,就给新任务使用空闲线程,如没有空闲线程,则产生新线程

3、如果池中的线程数=maximumPoolSize,则有空闲线程使用空闲线程,否则新任务放入ArrayBlockingQueue。(线程的空闲只有在ArrayBlockingQueue中不再有任务时才成立)

4、在池中线程数达到最大,并且没有空闲线程,并且ArrayBlockingQueue中满了。那么提交的任务将会被拒绝。这时将会调用ThreadPoolExecutor.CallerRunsPolicy 进行处理。按jdk文档里的描述:“用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。”此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。

ThreadPoolExecutor.CallerRunsPolicy 实现了 RejectedExecutionHandler 接口。jdk自带的还有其他3种处理机制。分别是

 ThreadPoolExecutor.AbortPolicy,ThreadPoolExecutor.DiscardOldestPolicy,ThreadPoolExecutor.DiscardPolicy

这里也可以自己定义类,实现RejectedExecutionHandler接口。来作为处理被拒绝任务的策略。

你可能感兴趣的:(java,线程池)