线程池 submit 方法结合 Callable Future 的使用
2013-10-07 05:50
405 查看
在工作中,将许多个任务交给线程池运作时,我们可能还会有以下需求:
1、需要取消某个任务的运行
2、需要接收任务运行的结果
3、需要在一个任务出错时候,停止未运行任务的运行(通过抛出异常,捕获异常则可以继续运行)
那么我们会用到线程池的 submit 方法,我们的任务需要实现Callable接口,任务的返回值和其取消操作被封装在Future(FutureTask实现)内部
举例:
1、需要取消某个任务的运行
2、需要接收任务运行的结果
3、需要在一个任务出错时候,停止未运行任务的运行(通过抛出异常,捕获异常则可以继续运行)
那么我们会用到线程池的 submit 方法,我们的任务需要实现Callable接口,任务的返回值和其取消操作被封装在Future(FutureTask实现)内部
举例:
import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.*; public class CallableTest { public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); List<Future> resultList = new ArrayList<Future>(); // 创建10个任务并执行 for (int i = 0; i < 10; i++) { // 使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中 // 最终会实例化一个FutureTask对象,其run方法会调用Callable的call方法,并且支持cancel等操作 Future future = executorService.submit(new TaskWithResult(i)); resultList.add(future);// 将任务执行结果存储到List中 } executorService.shutdown(); // 遍历任务的结果,未执行完会阻塞 for (Future fs : resultList) { // 打印各个线程(任务)执行的结果 System.out.println(fs.isDone() + "=" + fs.get() + "=" + fs.isDone()); } } } class TaskWithResult implements Callable { private int id; public TaskWithResult(int id) { this.id = id; } @Override public String call() throws Exception { System.out.println("call()方法被调用!" + Thread.currentThread().getName()); boolean flag = new Random().nextBoolean(); if (flag) { System.out.println("异常撞击!"); throw new TaskException("Meet error in task." + Thread.currentThread().getName()); } Thread.sleep(2000); return "结果是:" + id; } } class TaskException extends Exception { TaskException(String message) { super(message); } }
相关文章推荐
- java自定义任务类定时执行任务示例 callable和future接口使用方法
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- FutureTask和线程池的结合使用
- Java并发编程——线程池的使用(七)线程池的可执行任务:Future和Callable
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- callable结合FutureTask的多线程使用(免打扰模式)
- Android中Callable、Future、FutureTask的概念以及几种线程池的使用
- Callable、Runnable、Future、Executor的详细使用方法
- Java并发编程核心方法与框架-Future和Callable的使用
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Callable、Runnable、Future、Executor的详细使用方法
- java利用线程池(ExecutorService)配合Callable和Future实现执行方法超时的阻断
- Java四种线程池的使用以及callable future整理
- Java并发编程核心方法与框架-Future和Callable的使用
- callable结合FutureTask的多线程使用(免打扰模式)
- 多线程,线程池,使用CompletionService通过Future来处理Callable的返回
- java自定义任务类定时执行任务示例 callable和future接口使用方法
- Callable和Future结合使用的一个例子
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java并发编程之线程池、Callable和Future使用