`
jokermanager
  • 浏览: 140453 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用Callable返回结果

阅读更多

         本文是Sun官方以Blog形式发布的Java 核心技术窍门(Java C oreTechTip)中的一个。本文主要介绍了C allable及其相关接口和类的使用,篇幅不长且易于理解,故翻译在了此处,相信对于准备或刚接触java.util.concurrent的朋友会有所帮助。

    自从Java平台的最开始,Runnable接口就已存在了。它允许你定义一个可由线程完成的任务。如大多数人所已知的那样,它只提供了一个run方法, 该方法既不接受任何参数,也不返回任何值。如果你需要从一个未完成的任务中返回一个值,你就必须在该接口之外使用一个方法去等待该任务完成时通报的某种消 息。例如,下面的示例就是你在这种情景下可能做的事情:
    Runnable runnable = ...;
    Thread t = new Thread(runnable);
    t.start();
    t.join();
    String value = someMethodtoGetSavedValue()
严 格来说,上述代码并无错误,但现在可用不同的方法去做,这要感谢J2SE 5.0引入的Callable接口。不同于Runnable接口拥有run方法,Callable接口提供的是call方法,该方法可以返回一个 Object对象,或可返回任何一个在泛型化格式中定义了的特定类型的对象。
    public interface Callable<V> {
       V call() throws Exception;
    }
因为你不可能把Callable对象传到Thread对象去执行,你可换用ExecutorService对象去执行Callable对象。该服务接受Callable对象,并经由submit方法去执行它。
    <T> Future<T> submit(Callable<T> task)
如该方法的定义所示,提交一个Callable对象给ExecutorService会返回一个Future对象。然后,Future的get方法将会阻塞,直到任务完成。
    为了证明这一点,下面的例子为命令行中的每个词都创建一个单独的Callable实例,然后把这些词的长度加起来。各个Callable对象将只是计算它 自己的词的长度之和。Futures对象的Set集合将被保存以便从中获得计算用的值。如果需要保持返回值的顺序,则可换用一个List对象。

 import java.util.*;
import java.util.concurrent.*;

public class CallableExample {

    public static class WordLengthCallable
            implements Callable {
        private String word;
        public WordLengthCallable(String word) {
            this.word = word;
        }
        public Integer call() {
            return Integer.valueOf(word.length());
        }
    }

    public static void main(String args[]) throws Exception {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        Set<Future<Integer>> set = new HashSet<Future&lg;Integer>>();
        for (String word: args) {
            Callable<Integer> callable = new WordLengthCallable(word);
            Future<Integer> future = pool.submit(callable);
            set.add(future);
        }
        int sum = 0;
        for (Future<Integer> future : set) {
            sum += future.get();
        }
        system.out.printf("The sum of lengths is %s%n", sum);
        system.exit(sum);
    }
}

    WordLengthCallable保存了每个词并使用该词的长度作为call方法的返回值。这个值可能会花点儿时间去生成,不过在这个例子中,可以立 即知道它。 call方法的唯一要求是这个值要在call方法的结尾处返回。当Future的get方法稍后被调用时,如果任务运行得很快的话,Future将会自动 得到这个值(如同本例的情况),否则将一直等到该值生成完毕为止。多次调用get方法不会导致任务从该线程返回。因为该程序的目的是计划所有字的长度之 和,它不会强令Callable任务结束。如果最后一个任务在前三个任务之前完成,也是没错的。对Future的get方法的第一次调用将只会等待Set 中第一个任务结束,而不会阻塞其它的任务分别执行完毕。它只会等待当次线程或任务结束。这个特定的例子使用固定数线程池来产生 ExecutorService对象,但其它有效的方法也是可行的。
            关于执行器和线程池用法的更多信息,请见Java Tutorial中Executors一节。SwingWorker类是另一个使用Future的Runnable对象的例子,尽管有些微不同之处。更多 信息请见Java Tutorial中Worker Threads and SwingWorker一节。

分享到:
评论

相关推荐

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    http://blog.csdn.net/yangzhaomuma/article/details/51722779

    Callable和Future.doc

    Callable和Future详解: Callable和Runnable有几点不同: (1)Callable规定的方法是call(),而Runnable规定的方法是run();...(4)Callable返回结果可以被Future拿到,即Future可以拿到异步执行任务的返回值。

    Java多线程Callable接口

    在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。 import java.util.ArrayList; import java.util....

    Mybatis-Callable.zip

    一直以来感觉使用Mybatis查询存储过程...写了一个拦截器,可以把储存过程的输出参数当做返回值来返回。其实也简单不了多少,只不过在设计Dao接口的时候能更统一吧。 使用方式可以看一下这里 标签:Mybatis

    python __call__ 和 callable()

    callable() 描述 callable() 函数用于检查一个对象是否是可调用的。如果返回 True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。 对于函数、方法、lambda 函式、 类以及实现了 `__...

    Python callable()函数用法实例分析

    对于函数, 方法, lambda 函数式, 类, 以及实现了 _ _call_ _ 方法的类实例, 它都返回 True. &gt;&gt;&gt; help(callable) Help on built-in function callable in module __builtin__: callable(...) callable(object) -&gt; ...

    java多线程返回值使用示例(callable与futuretask)

    主要介绍了多线程返回值使用示例(callable与futuretask),需要的朋友可以参考下

    Python callable内置函数原理解析

    python内置函数 callable用于检查一个对象是否是可调用的,如果函数返回True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。 一.callable函数简介 语法如下: callable(object) ...

    使用Java异步编程实现一个简单的网络请求.txt

    这两个任务被封装成Callable对象并返回一个Future对象,用于表示异步计算的结果。 在主线程中,我们通过调用response1.get()和response2.get()方法来获取异步计算的结果。由于这两个方法都是阻塞的(即等待异步计算...

    python内置函数.pdf

    &gt;&gt;&gt; a="123" &gt;&gt;&gt; print callable(a) 0 &gt;&gt;&gt; print callable(chr) 1 cmp(x,y) cmp()函数比较 x 和 y 两个对象,并根据比较结果返回一个整数,如果 x,则返回-1;如果 x&gt;y,则返回 1,如果 x==y 则返回 0。 &gt;&gt;&gt;a=1 &gt;&gt;&gt;b...

    java多线程Future和Callable类示例分享

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们...

    PHP Callable强制指定回调类型的方法

    如果一个方法需要接受一个回调方法作为参数,我们可以这样写 &lt;?...function dosth($callback){ call_user_func($...我们可以使用callable来强制指定参数为回调类型,这样可以保证回调方法必须是可以调用的。 例

    springboot-scala-withswagger:Scala语言采用Spring-Boot结合Swagger的一个简单例子

    动作可以返回rx.Observable,就像返回Callable或DeferredResult一样,请参见RxJavaController 当控制器返回Callable / DeferredResult / Observable时,提供支持MDC值 先决条件 Maven / SBT 为什么使用maven而...

    判断python对象是否可调用的三种方式及其区别详解

    使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False一定不可调用。 官方文档:...

    线程超时死掉

    不直接构造Future对象,也可以使用ExecutorService.submit方法来获得Future对象,submit方法即支持以 Callable接口类型,也支持Runnable接口作为参数,具有很大的灵活性。使用示例如FutureTaskAndExcutor中的limit...

    Spring注解驱动开发实战-springMVC

    ServletContext注册三大组件 springmvc-定制与接管SpringMVC springmvc-异步请求-返回Callable 异步请求-返回DeferredResult.

    Java多线程实现四种方式原理详解

    1.继承Thread类,重写run方法 ...后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放在Object对象中 1. 继承Thread类 public class Thread

    浅谈python 线程池threadpool之实现

    首先介绍一下自己使用到的名词: 工作线程(worker):...任务处理函数(callable):工作线程get到任务后,通过调用任务的任务处理函数即(request.callable_)具体 的 处理任务,并返回处理结果; 任务结果队列

    Socket接受数据超时

    Socket接受数据超时,采用Callable 接口实现

Global site tag (gtag.js) - Google Analytics