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 
    
    Object
   
   
   
   
    
    implements 
    
    RunnableFuture<V>
   
   
 

可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。

可使用 FutureTask 包装 CallableRunnable 对象。因为FutureTask 实现了Runnable,所以可将FutureTask 提交给 Executor 执行。

除了作为一个独立的类外,此类还提供了 protected 功能,这在创建自定义任务类时可能很有用。

这个解释过于全面,没有突出重点,其实重点就在于FutureTask的get()方法。

先看一个demo:

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 Main {  
    /** 
     * @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 f1 = new FutureTask(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 f2 = new FutureTask(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构造函数提供的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值