Java Callable、Future的两种使用方式
来源:互联网 发布:如何评价巴基斯坦知乎 编辑:程序博客网 时间:2024/06/06 16:25
Java Callable、Future的两种使用方式
- Callable+Future
public class Test { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); Future<Integer> future = executor.submit(task); executor.shutdown(); /** 接下来就可以通过future来获取一些关于Task的运行信息了: 比如:future.get();来获取最后执行结果 future.isDown();来判断是否完成 等等... **/ }}class Task implements Callable<Integer>{ @Override public Integer call() throws Exception { int sum = 0; //do something; return sum; }}
- Callable+FutureTask
public class Test { public static void main(String[] args) { //第一种方式 ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); FutureTask<Integer> futureTask = new FutureTask<Integer>(task); executor.submit(futureTask); executor.shutdown(); //第二种方式 /** Task task = new Task(); FutureTask<Integer> futureTask = new FutureTask<Integer>(task); Thread thread = new Thread(futureTask); thread.start(); **/ /** 接下来就可以通过futureTask来获取一些关于Task的运行信息了: 比如:futureTask.get();来获取最后执行结果 futureTask.isDown();来判断是否完成 等等... **/ }}class Task implements Callable<Integer>{ @Override public Integer call() throws Exception { int sum = 0; //do something; return sum; }}
以上出自这篇博客,感谢作者。链接:http://www.cnblogs.com/dolphin0520/p/3949310.html
但其实这两种方法最终是一样的:
第一种方式Callable+Future最终也是以Callable+FutureTask的形式实现的。
在第一种方式中调用了: Future future = executor.submit(task);
那就让我们看看executor.submit(task)的源码吧:
//java.util.concurrent.AbstractExecutorService类中 /** * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task);//可以看到源码中其实是在submit(Callable<T> task)内部创建了一个RunnableFuture<T>接口实现类 execute(ftask); return ftask; }
而FutureTask又是RunnableFuture的实现类,那就再看看newTaskFor(Callable callable)里面干了什么:
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { return new FutureTask<T>(callable); }
现在清楚了吧。两种方式最终是同样实现的。至于其他优劣之处暂时我也没想到。以后再总结
阅读全文
0 0
- Java Callable、Future的两种使用方式
- Java Callable Future 使用
- Java—Callable,Future的使用
- Java的Callable和Future使用
- callable&future的使用
- Callable&&Future的基本使用
- Callable和future的使用
- java 实现线程的三种方式 Thread 、Runnable、 Callable Future
- java 多线程(一)---创建线程的三种方式Thread,Runnable,Callable与Future
- 创建线程的第三种方式Callable和Future CompletionService
- java中的Callable和Future的使用和困惑
- java多线程Future和Callable类的解释与使用
- java 使用Callable和Future返回线程执行的结果
- Java并发编程实践之Callable,Future,RutureTask的使用
- java再复习-Future与Callable的使用
- JAVA多线程—Callable和Future的使用介绍
- JAVA多线程实现的三种方式(继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程)
- Java四种线程池的使用以及callable future整理
- 堆排序
- eclipse中mybatis generator插件离线安装方法
- 项目管理工具——GitHub
- 蓝桥杯训练——最长递增子序列
- java.lang.ClassCastException: 错误解析
- Java Callable、Future的两种使用方式
- convert()函数在SQL中的使用
- java邮件发送工具
- python 模拟Http请求
- 在MyEclipse中启动Tomcat报错Error initializing endpoint java.net.SocketException: Unrecognized Windows Sock
- 观察者模式与回调
- SourceInsight下载、安装、破解、主题修改、其他配置全过程
- 2017.09.21--env环境变量
- Unknown Treasure HDU