Java线程池基础 线程池实现
- 2018-03-11 23:35:00
- admin
- 原创 1944
一、Java线程池基础
interface Callable<V>
1、V call(),相比Runnable,可以返回结果,可以抛出异常;
interface ThreadFactory
1、Thread newThread(Runnable r),构造一个可用线程;
interface Executor
1、void execute(Runnable command),提交任务,如果无法提交则抛出异常;
interface ExecutorService extends Executor
1、Future<?> submit(Runnable task),提交任务,并返回任务监视器;
2、Future<T> submit(Callable<T> task),提交任务,并返回任务监视器;
3、List<Future<T>> invokeAll(tasks),所有任务执行成功才返回,可以被中断,被中断时未完成任务取消;
4、T invokeAny(tasks),任意任务执行成功就返回,可以被中断,被中断时未完成任务取消;
5、void shutdown(),已提交任务继续执行,不再接受新任务;
6、List<Runnable> shutdownNow(),已执行任务强制终止,返回未执行任务;
7、boolean awaitTermination(long timeout, TimeUnit unit),等待线程池终止;
8、boolean isShutdown(),调用过shutdown;
9、boolean isTerminated(),线程池是否终止;
interface ScheduledExecutorService extends ExecutorService
1、ScheduledFuture<V> schedule(Callable<V> callable, delay, unit),执行定时任务一次,future可以等待任务执行;
2、ScheduledFuture<?> schedule(Runnable command, delay, unit),执行定时任务一次,future可以等待任务执行;
3、ScheduledFuture<?> scheduleAtFixedRate(command, delay, period, unit),固定速率重复执行任务,无法等待任务;
4、ScheduledFuture<?> scheduleWithFixedDelay(command, delay, period, unit),固定延迟重复执行任务,无法等待任务;
interface Future<V>
1、V get(),等待任务执行完成;
2、V get(long timeout, TimeUnit unit),等待任务执行完成;
4、boolean isCancelled(),任务是否被取消;
5、boolean isDone(),任务是否完成,包括任务被取消;
interface ScheduledFuture<V> extends Delayed, Future<V>
interface RunnableScheduledFuture<V> extends RunnableFuture<V>, ScheduledFuture<V>
1、ScheduledFuture只是继承Delayed和Future接口,没有新增任何方法;
2、RunnableScheduledFuture增加isPeriodic方法,决定任务是否周期性执行;
使用详解:
1、Executor不允许提交null任务,否则抛出NullPointerException;
2、ExecutorService不允许提交null任务,否则抛出NullPointerException;
二、Java线程池实现
FutureTask<V> implements RunnableFuture<V>
1、RunnableFuture接口继承Runnable和Future接口;
2、FutureTask维护一个等待队列,等待结果的线程都被放入队列;
3、成功取消任务时,所有等待线程都会立即收到通知;
4、成功取消任务时,已经运行的任务无法被终止,最多只能收到中断标志位;
5、成功取消任务时,任务不会立即从消息队列删除,而是被线程池从队列取出来空跑一次;
interface RejectedExecutionHandler
AbortPolicy implements RejectedExecutionHandler
1、rejectedExecution方法用于拒绝任务;
2、AbortPolicy拒绝任务时抛出异常RejectedExecutionException;
class AbstractExecutorService implements ExecutorService
class ThreadPoolExecutor extends AbstractExecutorService
1、boolean prestartCoreThread(),启动一个核心线程,节约线程创建时间;
2、int prestartAllCoreThreads(),启动所有核心线程,节约线程创建时间;
3、void allowCoreThreadTimeOut(boolean value),设置核心线程是否可以销毁;
4、void purge(),立即清除队列中所有取消的任务;
5、void beforeExecute(Thread t, Runnable r),开始执行任务回调;
6、void afterExecute(Runnable r, Throwable t),结束执行任务回调;
7、void terminated(),终止线程池回调;
interface CompletionService<V>
class ExecutorCompletionService<V> implements CompletionService<V>
1、Future<V> poll(),检索已经完成的任务;
2、Future<V> poll(long timeout, TimeUnit unit),检索已经完成的任务,允许指定超时时间;
3、Future<V> take(),检索已经完成的任务,如果检索失败则一直等待;
4、该线程池构造需要传入一个线程池,传入的线程池用于实际执行任务;
5、该线程池维护一个存放已经完成任务的队列,默认队列是LinkedBlockingQueue;
6、QueueingFuture继承FutureTask,实现done方法,在任务执行完成时将代理的任务放入队列;
class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService
1、void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value),SHUTDOWN状态是否可以继续执行周期任务,默认false;
2、void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value),SHUTDOWN状态是否可以继续执行延迟任务,默认true;
3、void setRemoveOnCancelPolicy(boolean value),取消任务时是否立即从队列删除任务;
4、ScheduledExecutorService可以提交一次性或周期性任务,周期性任务执行完成后会被重新放入队列;
5、ScheduledExecutorService使用DelayedWorkQueue,任务到期了才能被取出来,获取和删除元素时间都是O(1);
6、ScheduledExecutorService线程数量实际固定为核心线程数量,因为消息队列容量是无限的,可以无限放入任务;
7、ScheduledExecutorService实现了回调方法onShutdown,清除不需要运行的调度任务,这样线程池才能快速退出;
class Executors
1、ExecutorService newCachedThreadPool(),线程数量0到Integer.MAX_VALUE,有效期60秒,使用SynchronousQueue;
2、ExecutorService newFixedThreadPool(int n),线程数量固定为n,有效期0秒,使用LinkedBlockingQueue;
3、ExecutorService newSingleThreadExecutor(),线程数量固定为1,有效期0秒,使用LinkedBlockingQueue;
4、ScheduledExecutorService newScheduledThreadPool(int core),线程数量core到Integer.MAX_VALUE,有效期0秒;
线程池生命周期:
1、RUNNING,可以接收新任务,可以处理队列的任务;
2、SHUTDOWN,不可以接收新任务,可以处理队列的任务;
3、STOP,不可以接收新任务,不可以处理队列的任务,并且中断运行中的任务;
4、TIDYING,所有任务终止,线程数量清零;
5、TERMINATED,terminated方法调用完成;
使用详解:
1、corePoolSize核心线程数量,maximumPoolSize最大线程数量,线程池空闲时会回收大于核心线程数量的线程;
2、keepAliveTime线程最长空闲时间,setKeepAliveTime修改该值,如果该值变小则会导致所有空闲线程被中断一次;
3、allowCoreThreadTimeOut表示核心线程是否可以销毁,keepAliveTime为零时allowCoreThreadTimeOut不能为true;
4、每个线程池包含一个重入锁,增加或销毁线程时都会持有锁,同时维护一个termination条件,线程池终止时收到通知;
5、每个工作线程被包装成一个Worker,Worker同时是一个非重入锁,负责获取和执行用户任务,执行用户任务的时候会锁住;
6、submit提交的任务需要包装成FutureTask,然后再调用execute,所以execute效率更高;
7、submit提交Callable时任务直接包装成FutureTask,submit提交Runnable时任务先包装成RunnableAdapter;
8、提交任务:如果核心线程数量不够,则创建新线程运行任务,否则将任务放入等待队列;
9、提交任务:如果任务无法放入等待队列,则创建新线程运行任务,达到最大线程数量则拒绝该任务;
10、单线程线程池一次只能执行一个任务,保证任务按照提交顺序执行;