快速开始
快速开始
实例化ExecutorService
实例化
Executors.newFixedThreadPool() 工厂方法创建ExecutorService 实例
创建
ExecutorService executor = Executors.newFixedThreadPool(10);
当然还有其它很多工厂方法,每种工厂方法都可以创建满足特定用例的预定义
直接创建ExecutorService 的实例
因为
ExecutorService executorService =
new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()
);
将任务分配给ExecutorService
Runnable runnableTask = () -> {
try {
TimeUnit.MILLISECONDS.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Callable<String> callableTask = () -> {
TimeUnit.MILLISECONDS.sleep(300);
return "Task's execution";
};
List<Callable<String>> callableTasks = new ArrayList<>();
callableTasks.add(callableTask);
callableTasks.add(callableTask);
callableTasks.add(callableTask);
创建完了任务之后,就可以使用多种方法将任务分配给
- 首先来看看
execute() 方法。
该方法返回值为空
executorService.execute(runnableTask);
- 其次看看
submit() 方法。
Future<String> future = executorService.submit(callableTask);
- 然后是
invokeAny() 方法。
String result = executorService.invokeAny(callableTasks);
- 最后是
invokeAll() 方法。
List<Future<String>> futures = executorService.invokeAll(callableTasks);
关闭ExecutorService
一般情况下,
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
}
-
shutdown 方法:这个方法会平滑地关闭ExecutorService ,当我们调用这个方法时,ExecutorService 停止接受任何新的任务且等待已经提交的任务执行完成( 已经提交的任务会分两类:一类是已 经在执行的,另一类是还没有开始执行的) ,当所有已经提交的任务执行完毕后将会关闭ExecutorService 。 -
awaitTermination 方法:这个方法有两个参数,一个是timeout 即超 时时间,另一个是unit 即时间单位。这个方法会使线程等待timeout 时长,当超过timeout 时间后,会监测ExecutorService 是否已经关闭,若关闭则返回true ,否则返回false 。一般情况下会和shutdown 方法组合使用。 -
shutdown() 方法:
executorService.shutdown();
shutdownNow() 方法:
List<Runnable> notExecutedTasks = executorService.shutDownNow();
因为提供了两个方法,因此关闭
executorService.shutdown();
try {
if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}
Future 接口
Future 接口get() 方法
而且更重要的是,正在被执行的任务随时都可能抛出异常或中断执行。因此我们要将
Future<String> future = executorService.submit(callableTask);
String result = null;
try {
result = future.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
因为 get()
方法是阻塞的,而且并不知道要阻塞多长时间。因此可能导致应用程序的性能降低。如果结果数据并不重要,那么我们可以使用超时机制来避免长时间阻塞。
String result = future.get(200, TimeUnit.MILLISECONDS);
这个 get()
的重载,第一个参数为超时的时间,第二个参数为时间的单位。上面的实例所表示就的就是等待
注意,这个 get()
重载方法,如果在超时时间内正常结束,那么返回的是
除了
方法 | 说明 |
---|---|
isDone() | 检查已分配的任务是否已处理 |
cancel() | 取消任务执行 |
isCancelled() | 检查任务是否已取消 |
这些方法的使用方式如下
boolean isDone = future.isDone();
boolean canceled = future.cancel(true);
boolean isCancelled = future.isCancelled();