Java线程池(1)——线程池中的几个重要类
来源:互联网 发布:知乎回答怎么取消匿名 编辑:程序博客网 时间:2024/06/18 17:45
【内容摘要】
在java中,如果需要进行多线程编程,可以采用java自带的线程池来实现,线程池对于我们新手来说是一个非常好的选择,因为我们可以不用关心线程池中线程是如何调度的,避免在多线程编程过程产生死锁等问题。在了解线程池的使用前,本文首先介绍一下java线程池的内部原理。
【正文】
一、Java线程池中的几个重要类
1.ThreadPoolExecutor类
ThreadPoolExecutor类是java线程池中最核心的一个类,它提供了四个构造函数如下:
public class ThreadPoolExecutor extends AbstractExecutorService { ..... //构造器1 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); //构造器2 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory); //构造器3 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler); //构造器4 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler); ...}
由构造函数可知,ThreadPoolExecutor继承了AbstractExecutorService类,构造器中各个参数的含义如下:
(1)corePoolSize:核心池的大小,在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列workQueue当中,后面会详细介绍该队列;
(2)maximumPoolSize:线程池最大线程数,它表示在线程池中最多能创建多少个线程;
(3)keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
(4)unit:参数keepAliveTime的时间单位,取值如:TimeUnit.DAYS、TimeUnit.HOURS等
(5)workQueue:一个阻塞队列,用来存储等待执行的任务,阻塞队列有以下几种选择:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue。线程池的排队策略与workQueue有关。
(6)threadFactory:线程工厂,主要用来创建线程;
(7)handler:表示当拒绝处理任务时的策略,有以下四种取值:
□ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
□ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
□ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
□ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
2.AbstractExecutorService抽象类
ThreadPoolExecutor类继承了抽象类AbstractExecutorService,其实现简略如下:
public abstract class AbstractExecutorService implements ExecutorService { protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {}; protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {}; public Future<?> submit(Runnable task) {}; public <T> Future<T> submit(Runnable task, T result) {}; public <T> Future<T> submit(Callable<T> task) {}; private <T> T doInvokeAny(Collection<? extends Callable<T>> tasks,boolean timed, long nanos) throws InterruptedException, ExecutionException, TimeoutException {}; public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {}; public <T> T invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) throws InterruptedException,ExecutionException, TimeoutException {}; public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {}; public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) throws InterruptedException {};}
3.ExecutorService接口
AbstractExecutorService抽象类实现的是ExecutorService接口,在这个接口中,定义了如下方法:
public interface ExecutorService extends Executor { void shutdown(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task); <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException; <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)throws InterruptedException; <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException; <T> T invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) throws InterruptedException,ExecutionException, TimeoutException;}
4.Executor接口
Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),如下:
public interface Executor { void execute(Runnable command);}
从字面意思可以理解,就是用来执行传进去的任务的;
至此,可以看出Executor、ExecutorService、AbstractExecutorService和ThreadPoolExecutor之间的关系:Executor是一个顶层接口,ExecutorService实现了Executor接口;然后,AbstractExecutorService实现了ExecutorService接口,但并未实现具体内容,最后的具体实现由ThreadPoolExecutor来执行。
【参考文献】
http://www.cnblogs.com/dolphin0520/p/3932921.html
- Java线程池(1)——线程池中的几个重要类
- Java线程池(2)——线程池中的几个重要方法详解
- Java 线程中的几个重要方法
- java线程中的重要方法
- Java中的线程池(1)
- JAVA中的线程池
- java中的线程池
- Java中的线程池
- java中的线程池
- java中的线程池
- Java中的线程池
- java中的线程池
- java中的线程池
- java 中的线程池
- Java中的线程池
- java中的线程池
- Java中的线程池
- Java中的线程池
- 全志H3 耳机检测驱动代码
- 聪聪可可
- Linux-iscsi的共享设定
- 输入三个数,用指针实现由大到小输出
- hdoj 1001 水题坑人 小心
- Java线程池(1)——线程池中的几个重要类
- qmainwindow键盘监听
- easyUi的号码验证
- 03JS语法基础_js代码的语法规则
- 51Nod 1873 初中的算术 BigDecimal
- Python编程快速上手 实践项目8.9.2
- ViewPager实现自动轮播+手动添加小圆点的Mainactivity
- POJ1741
- 基于python的机器学习零基础算法到面试实践必修学习路线推荐