🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**1. 控制任务组** 即将多个任务通通放到一个集合中,然后调用执行器依次执行每个任务。 <br/> **2. 实现控制任务组代码块** * 写法一:缺点是如果第一个任务花费了太多的时间,,则必须等待该线程。 ``` // 将所有的任务存储到集合中 List<Callable<T>> tasks = ...; // 将所有的任务提交到执行器中,并返回每个任务的处理结果 // executor为Executor类对象 List<Future<T>> results = executor.invokeAll(tasks); // 依次处理每个任务的结果 for (Future<T> result : results) { // 通过service.take().get()获取处理结果,然后对结果自行处理 // processFurther是自定义的处理方法 processFurther(service.take().get()) } ``` * 写法二:建议使用该写法。 ``` // 将所有的任务存储到集合中 List<Callable<T>> tasks = ...; // 将执行器提交到ExecutorCompletionService对象中 // executor为Executor类对象 ExecutorCompletionService<T> service = new ExecutorCompletionService<>(executor); // 依次将任务提交到ExecutorCompletionService对象中 for (Callable<T> task : tasks { service.submit(task); } // 依次处理每个任务的结果 for (int i = 0; i < tasks.size(); i++) { // 通过service.take().get()获取处理结果,然后对结果自行处理 // processFurther是自定义的处理方法 processFurther(service.take().get()); } ``` * java.util.concurrent.ExecutorService 5.0 * `T invokeAny(Collection<Callable<T>> tasks)` * `T invokeAny(Collection<Callable<T>> tasks, long timeout, TimeUnit unit)` 执行给定的任务,返回其中一个任务的结果。第二个方法发生超时,则抛出TimeoutException异常。 * `List<Future<T>> invokeAll(Collection<callable<T>> tasks)` * `List<Future<T>> invokeAll(Collection<Callable<T>> tasks, long timeout, TimeUnit unit)` 执行给定的任务,返回所有任务的结果。第二个方法发生超时,则抛出TimeoutException异常。 * java.util.concurrent.ExecutorCompletionService< V> 5.0 * `ExecutorCompletionService(Executor e)` 构建一个执行器来完成服务,并收集给定执行器执行的结果。 * `Future<V> submit(Callable<V> task)` * `Future<V> submit(Runnable task, V result)` 提交一个任务给底层的执行器。 * `Future<V> take()` 移除下一个已完成的结果,如果没有任何已完成结果,则阻塞。 * `Future<V> poll()` * `Future<V> poll(long time, TimeUnit unit)` 移除下一个已完成的结果,