多线程之线程池

来源:互联网 发布:sybase数据库12.5 编辑:程序博客网 时间:2024/06/06 02:34

线程框架关系:

Executor 接口
ExecutorService 接口                                继承 Executor 
AbstractExecutorService 抽象类            实现 ExecutorService                       
ThreadPoolExecutor                                   继承AbstractExecutorService       重载一系列方法


Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的;

ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;

ThreadPoolExecutor类中有几个非常重要的方法:

execute():向线程池提交一个任务。在Executor声明
submit():向线程池提交一个任务,有返回结果(future).在ExecutorService声明,AbstractExecutorService 实现,而ThreadPoolExecutor并没有重写
shutdown()用来关闭线程池的。线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;
shutdownNow()用来关闭线程池的。则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务;


ThreadPoolExecutor:参数解析

1.int corePoolSize核心池的大小

       线程池初始化时,线程池没有任何线程(线程数为0),等有任务来,才创建线程去执行任务(除非显示调用prestartAllCoreThreads()或者prestartCoreThread())。

当线程池中的线程数据达到该值,后面来的任务,将放在缓存队列中

2.int maximumPoolSize: 线程池最大线程数


3.long keepAliveTime线程存活时间

      线程空闲最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用。即当线程池中的线程数大于corePoolSiz时,

如果一个线程空闲的时间达到keepAliveTime,则会终止。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize,

keepAliveTime参数也会起作用,直到线程池中的线程数为0;


4.TimeUnit unit单位


5.BlockingQueue<Runnable> workQueue:工作队列

        ArrayBlockingQueue;LinkedBlockingQueue;SynchronousQueue;


6.ThreadFactory threadFactory:  线程工厂,主要用来创建线程;



7.RejectedExecutionHandler handler:表示当拒绝处理任务时的策略

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 


线程池状态:

 RUNNING/SHUTDOWN/STOP

当创建线程池后,初始时,线程池处于RUNNING状态;

如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕;

如果调用了shutdownNow()方法,则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务;

当线程池处于SHUTDOWN或STOP状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被设置为TERMINATED状态。


  corePoolSize,maximumPoolSize,workQueue之间关系


1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。 
2.当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 
3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务 
4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理 
5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程 
6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭 


原创粉丝点击