Java线程池基础 线程池实现

2018-03-11 23:35:00
admin
原创 1842
摘要:Java线程池基础 线程池实现

一、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),等待任务执行完成;

3、boolean cancel(boolean mayInterruptIfRunning),任务未执行则直接取消,任务已执行则根据参数决定是否中断;

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、单线程线程池一次只能执行一个任务,保证任务按照提交顺序执行;

发表评论
评论通过审核之后才会显示。