Java FutureTask理解
尊敬原创作者,转载请注明出处:
http://blog.csdn.net/gemmem/article/details/8956703
FutureTask是为了弥补Thread的不足而设计的,它可以让程序员准确地知道线程什么时候执行完成并获得到线程执行完成后返回的结果(如果有需要)。
java.util.concurrent
类 FutureTask<V>
java.lang.Object
java.util.concurrent.FutureTask<V>
- 类型参数:
V
- 此 FutureTask 的 get 方法所返回的结果类型。
- 所有已实现的接口:
- Runnable, Future<V>, RunnableFuture<V>
public class FutureTask<V>extends Objectimplements RunnableFuture<V>
可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对Future
的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。
可使用 FutureTask 包装 Callable
或Runnable
对象。因为FutureTask 实现了Runnable,所以可将FutureTask 提交给 Executor
执行。
除了作为一个独立的类外,此类还提供了 protected 功能,这在创建自定义任务类时可能很有用。
这个解释过于全面,没有突出重点,其实重点就在于FutureTask的get()方法。
先看一个demo:
package base2; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.Callable; public class Concurrent_FutureTask {
/**
* @param args
*/
public static void main(String[] args) {
MyCall task1 = new MyCall("this is task1");
MyCall.Result result = new MyCall.Result();
result.setFlag("this is result");
ExecutorService pool = Executors.newFixedThreadPool(3);
Future<MyCall.Result> f1 = new FutureTask<MyCall.Result>(task1) {
@Override
protected void done() {
try { MyCall.Result r = (MyCall.Result) get(); System.out.println(r.getFlag() + " about callable");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.done();
} };
Future<MyCall.Result> f2 = new FutureTask<MyCall.Result>(new MyRun(),result){
@Override
protected void done() {
try { MyCall.Result r = (MyCall.Result) get(); System.out.println(r.getFlag() + " about runnable");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.done();
}
};
pool.execute((Runnable) f1);
pool.execute((Runnable) f2);
} } class MyCall implements Callable {
Result r;
String j = "";
MyCall() { } MyCall(String flag) {
j = flag;
}
@Override
public Result call() throws Exception {
System.out.println("this is MyCall call");
r = new Result();
r.setFlag(j);
return r;
} public static class Result {
private String flag = ""; public String getFlag() {
return flag;
} public void setFlag(String flag) {
this.flag = flag;
}
}
} class MyRun implements Runnable{ @Override
public void run() {
System.out.println("this is MyRun run"); } }
对代码做如下分析:
pool.execute((Runnable) f1)执行后,会创建一个线程,并执行MyCall的call方法,call方法执行完毕后,f1 实例的done()立即执行,这时候f1实例的get()方法会返回之前call()方法返回的Result实例。
pool.execute((Runnable) f2)的执行和f1类似,不同的是其中done()中的get()返回的实例是f2构造函数提供的。
Java FutureTask理解的更多相关文章
- [java] 深入理解内部类: inner-classes
[java] 深入理解内部类: inner-classes // */ // ]]> [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...
- Java初始化理解与总结 转载
Java的初始化可以分为两个部分: (a)类的初始化 (b)对象的创建 一.类的初始化 1.1 概念介绍: 一个类(class)要被使用必须经过装载,连接,初始化这样的过程. 在装载阶段,类装载器会把 ...
- 从Java视角理解CPU上下文切换(Context Switch)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快 ...
- 从Java视角理解CPU缓存(CPU Cache)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...
- Java IO 理解流的概念
Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...
- Effective Java通俗理解(持续更新)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
- JAVA个人理解
为了找到别人写的好文章,先分享下自己的知识,找找感觉路线. 学java前接触的c,后来转向java.第一个照面理解的就是面向对象,没想到让我想了好多年.当时有个负责任的老师说面向对象这个词具体释义众说 ...
- Effective Java通俗理解(上)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
随机推荐
- javascript split() 正则表达式
路由匹配 http.createServer(function(req, res) { var items = req.url.split('/'); if (items.length < 3 ...
- 在用VS2010连接oracle数据库时ORA-12504错误
在用VS2010连接oracle数据库时,可能会出现: ORA-12504: TNS: 监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME 只需在web.config文件Data ...
- app抓包
http://www.360doc.com/content/14/1126/11/9200790_428168701.shtml 记得下载证书 不然有些网站是抓不到的
- VS2010调试多进程--医疗His调试中使用
有些时候碰到自己开发的程序嵌入到别人的框架中,而在接口的地方出了问题,而又不方便将自己的模快加入到别人的工程中这个时候VS的附加到进程调试变得不可或缺了,直奔主题 http://msdn.micros ...
- (转)javascript中的this
JavaScript中的this总是让人迷惑,应该是js众所周知的坑之一. 个人也觉得js中的this不是一个好的设计,由于this晚绑定的特性,它可以是全局对象,当前对象,或者…有人甚至因为坑大而不 ...
- inner join跟where查询的区别
- CI框架篇之视图篇--载入(1)
创建视图 创建视图文件很简单,只需要建立后缀名为‘.php’的文件, 然后保存文件到 application/views/ 文件夹即可 当然,随着工程的大小,你有必要对很多的视图根据控制器进行归类, ...
- C#DbHelperMySQL数据库帮助类 (转载)
主要功能如下数据访问抽象基础类 主要是访问Mysql数据库主要实现如下功能 .得到最大值 .是否存在 .是否存在(基于MySqlParameter) .执行SQL语句,返回影响的记录数 .执行MySq ...
- Ubuntu1404+Django1.9+Apache2.4部署配置2配置文件设置
转载注明出处,个人博客:http://www.cnblogs.com/wdfwolf3/ Django首要的部署平台是WSGI,它是Python Web服务器和应用的标准.使用Apache和mod_w ...
- css3 iphone开关 移动端开关、按钮、input
css3 iphone开关 移动端开关.按钮.input <!DOCTYPE html> <html> <head> <meta charset=&quo ...