目录
使用Executor
使用executor可以实现类似与Thread的方法开辟线程,避免手动操作线程的创建:
使用execute方法执行一个Runnable接口的实现。但是存在很多限制:
1. 无法获取返回值(使用的是Runnable接口)
2. 无法知道线程执行的进度,无法取消任务。(不会返回Future对象)
3. 无法执行批量的任务。(就是一个单纯的执行)
4. 无法终止线程。(没有Future对象,没法操作指定线程)
ExecutorService
Executor的问题,ExecutorService帮忙解决了:
boolean awaitTermination(long timeout, TimeUnit unit)
等待线程完成,当调用shutdown或超时时间到了或被意外中断了线程,线程退出返回true,超时返回false
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
执行所有的任务,并返回一个List<Future<T>>的集合
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
带有超时时间的执行所有的任务,并返回一个List<Future<T>>的集合,超时后,未执行完成的任务将被取消。
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
执行所有的任务,并返回一个执行成功的结果。未完成的将被取消。
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
带有超时时间的执行所有的任务,并返回一个执行成功的结果。未完成的将被取消。
boolean isShutdown()
判断是否被停止。
boolean isTerminated()
调用shutdown或shutdownNow后是否执行完成。
void shutdown()
终止任务的执行,不再接受新的任务。
List<Runnable> shutdownNow()
尽最大努力停止当前执行的任务,并中断等待的任务。
<T> Future<T> submit(Callable<T> task)
提交一个异步任务,返回一个对应的Future对象。
Future<?> submit(Runnable task)
提交一个异步任务,返回一个对应的Future对象。
<T> Future<T> submit(Runnable task, T result)
提交一个异步任务,返回一个对应的Future对象。成功执行,该对象的get方法返回值为result
Future
表示一个Task的未来控制对象,维护任务状态,获取任务的结果,判断任务是否完成等等。
boolean cancel(boolean mayInterruptIfRunning)
取消任务,参数表示是否中断线程。
V get()
阻塞并等待任务执行的返回值
V get(long timeout, TimeUnit unit)
带有超时的阻塞并等待任务执行的返回值
boolean isCancelled()
是否被取消
boolean isDone()
是否结束(正常结束,异常,被取消)
ExecutorService使用方法
使用executorService实例的submit提交任务,使用任务的get方法阻塞获取结果。
Executors
此类提供的静态方法可以提供ExecutorService的实现:
newCachedThreadPool()
可以创建无限个线程。
newSingleThreadExecutor()
只有一个线程,无限长等待队列
newFixedThreadPool(int nThreads)
固定个数的线程池,无限长等待队列。
newSingleThreadScheduledExecutor()
只有一个线程,执行定时任务或循环周期任务
newScheduledThreadPool(int corePoolSize)
定时任务或循环周期执行的任务。
使用示例:
使用ExecutorService提交任务
这里使用newFixedThreadPool创建了一个线程池,创建了一个Callable实现。
这里使用executorService的submit方法提交了一个任务,返回一个Future对象。
使用isDone判断线程是否完成(正常完成、异常或取消)
使用get获取执行结果
使用shutdownNow停止线程池。