zoukankan      html  css  js  c++  java
  • Java

    http://blog.csdn.net/pipisorry/article/details/44341579

    Introduction

    Callable接口代表一段能够调用并返回结果的代码;

    Future接口表示异步任务。是还没有完毕的任务给出的未来结果。

    所以Callable用于产生结果,Future用于获取结果。


    Callable接口:Java 5在concurrency包中引入了java.util.concurrent.Callable 接口。它和Runnable接口非常类似,但它能够返回一个对象或者抛出一个异常。Callable接口使用泛型去定义它的返回类型。

    Executors类:提供了一些实用的方法在线程池中运行Callable内的任务。因为Callable任务是并行的,我们必须等待它返回的结果。

    Future对象:java.util.concurrent.Future对象为我们攻克了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它能够知道Callable任务的状态和得到Callable返回的运行结果。Future提供了get()方法让我们能够等待Callable结束并获取它的运行结果。

    Callable接口的源代码:

        public interface Callable<V> {  
            V call() throws Exception; // 计算结果  
        }  
    

    Future接口的源代码:

        public interface Future<V> {  
            boolean  cancel(boolean mayInterruptIfRunning);// 试图取消对此任务的运行  
            boolean  isCancelled();      // 假设在任务正常完毕前将其取消,则返回 true  
            boolean  isDone();           // 假设任务已完毕,则返回 true  
            V  get() throws InterruptedException, ExecutionException; // 如有必要。等待计算完毕,然后获取其结果  
            // 如有必要,最多等待为使计算完毕所给定的时间之后,获取其结果(假设结果可用)。  
            V  get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;  
        }  


    一个样例

    private ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
    		try {
    			Callable<TopicModel> callable = new TopicModelCallable(corpus,
    					param);
    			Future<TopicModel> future = executor.submit(callable);
    			futureList.add(future);
    		} catch (Exception ex) {
    			ex.printStackTrace();
    		}

    			for (Future<TopicModel> future : futureList) {
    				TopicModel topicModel = future.get();
    				topicModelList.add(topicModel);
    			}
    
    Note:

    1. 用语料和相应參数创建可调用对象callable, 提交给executor并行运行, 结果保存在future对象中。最后能够用future对象的get()方法提取运行结果

    2. ExcutorService接口

    ExecutorService提供了管理终止的方法,以及可为跟踪一个或多个异步任务运行状况而生成 Future 的方法。

    主要函数:

    <T> Future<T> submit(Callable<T> task)
        提交一个返回值的任务用于运行,返回一个表示任务的未决结果的 Future。

    该 Future 的 get 方法在成功完毕时将会返回该任务的结果。     假设想马上堵塞任务的等待,则能够使用 result = exec.submit(aCallable).get(); 形式的构造。

        注:Executors 类包含了一组方法,能够转换某些其它常见的类似于闭包的对象,     比如,将 PrivilegedAction 转换为 Callable 形式,这样就能够提交它们了。     參数:         task - 要提交的任务      返回:         表示任务等待完毕的 Future      抛出:         RejectedExecutionException - 假设任务无法安排运行          NullPointerException - 假设该任务为 null 注意:关于submit的使用和Callable能够參阅《使用Callable返回结果

    [java中Executor、ExecutorService、ThreadPoolExecutor介绍]

    from:http://blog.csdn.net/pipisorry/article/details/44341579

    ref:http://blog.csdn.net/mazhimazh/article/details/19291965

    [怎样管理Java线程池及搭建分布式Hadoop调度框架]


  • 相关阅读:
    SQL函数 【转】
    Oracle修改表,提示“资源正忙,要求指定NOWAIT”
    网关的通俗讲解【转】
    程序员小抄大全
    JQuery 中each的使用方法
    JQueryUI入门所有效果说明【转】
    随记小笔(20100820)
    asp.net操纵Oracle存储过程
    JQuery技巧总结【转】
    Centos7 进入单用户模式,修复系统
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7029166.html
Copyright © 2011-2022 走看看