java执行器
Executor
执行已提交的 Runnable 任务对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。Executor 接口并没有严格地要求执行是异步的。
public interface Executor { void execute(Runnable command); }
ExecutorService
ExecutorService是Executor的子类,扩展了更多的方法。提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService,这将导致其拒绝新任务。
提供两个方法来关闭 ExecutorService。 shutdown()方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务的启动并试图停止当前正在执行的任务。
关闭任务执行,已经提交的会等执行完再关闭*/ void shutdown(); /** * 立即关闭任务执行*/ List<Runnable> shutdownNow(); /** 是否被shutdown*/ boolean isShutdown(); /** 在shutdown方法被调用后,如果所有任务结束则返回true*/ boolean isTerminated(); /**
在shutdown方法被调用后,阻塞直到所有任务完成。可以设置timeout时间,如果超时,返回false。
*/ boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
提供三个方法来跟踪一个异步任务执行。
/** * 执行一个callable,返回一个future*/ <T> Future<T> submit(Callable<T> task); /** * 执行一个callable,返回一个future,通过future的get方法获得result值。*/ <T> Future<T> submit(Runnable task, T result); /** *执行一个runnable,返回一个future*/ Future<?> submit(Runnable task);
提供四个方法来执行批量任务
/** 执行多个callable,返回多个future,该方法会一直阻塞到所有任务完成*/ <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException; /** 执行多个callable,返回多个future,该方法会一直阻塞到所有任务完成,如果timeout,抛出异常,取消尚未执行的任务*/ <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException; /** * 任意一个callable执行成功后返回,取消尚未执行完的任务*/ <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException; /** * 任意一个callable执行成功后返回,取消尚未执行的任务,如果timeout,抛出异常,取消尚未执行的任务*/ <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
ThreadPoolExecutor
ThreadPoolExecutor是ExecutorService的一个实现类,它使用池线程执行每个提交的任务。
ThreadPoolExecutor内部用一个变量保存了两个内容:所有有效线程的数量各个线程的状态(runState)。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
ThreadPoolExecutor内部有一个队列,当提交任务时,首先会提交到队列中,执行任务时会从队列中获取任务。
ThreadPoolExecutor将根据corePoolSize(参见 getCorePoolSize())和 maximumPoolSize(参见 getMaximumPoolSize()) 设置的边界自动调整池大小。当新任务在方法 execute(java.lang.Runnable) 中提交时,如果运行的线程少于 corePoolSize, 则创建新线程来处理请求,即使有线程是空闲的。 如果运行的线程多于 corePoolSize 而少于 maximumPoolSize,则仅当队列满时才创建新线程。 如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。 如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。