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

[

articleid=3218">怎样管理Java线程池及搭建分布式Hadoop调度框架]

Java - 多线程Callable、Executors、Future的更多相关文章

  1. Java多线程Callable和Future类详解

         public interface Callable<V>    返回结果并且可能抛出异常的任务.实现者定义了一个不带任何参数的叫做 call 的方法      public in ...

  2. Java多线程 - Callable和Future

    已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...

  3. Java多线程-Callable的Future返回值的使用

    一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中: public interface Executor { void execute(Runnable comm ...

  4. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  5. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  6. java并发--Callable、Future和FutureTask

    在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就 ...

  7. Java Callable Future Example(java 关于Callable,Future的例子)

    Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...

  8. java 多线程 Callable中的futrue模式

    java实现Callable接口中用到了future模式,所以实现了这个接口就看到了有返回值,那它的基本原理是什么鬼,往下看. 何为future模式? future模式有点类似于商品订单.在网上购物时 ...

  9. JAVA 多线程 Callable 与 FutureTask:有返回值的多线程

    java多线程中,如果需要有返回值,就需要实现Callable接口. 看例子: 先建立一个Dowork这个类,就是平时某个业务的实现 package com.ming.thread.one; impo ...

  10. java多线程之 Executors线程池管理

    1. 类 Executors 此类中提供的一些方法有: 1.1 public static ExecutorService newCachedThreadPool() 创建一个可根据需要创建新线程的线 ...

随机推荐

  1. java整型byte,short,int,long取值范围大小

     byte 1个字节 short 2个字节 int 4个字节long 8 个字节 varchar 可变长度的非Unicode数据,最长为8000个字符nvarchar 可变长度Unicode数据,最长 ...

  2. HDU 4390 Number Sequence (容斥原理+组合计数)

    HDU 4390 题意: 大概就是这样.不翻译了: Given a number sequence b1,b2-bn. Please count how many number sequences a ...

  3. Chrome插件Axure RP Extension

    Chrome插件Axure RP Extension 1.将文件夹“0.6.2_0”复制到Chrome文件夹中某个位置. 2.打开Chrome,打开[设置] - [扩展程序],勾选右上角的“开发者模式 ...

  4. C++中的字节对齐

    本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! 字节对齐 1. 基本概念字节对齐:计算机存 ...

  5. Okio简化处理I/O操作原理

    转载:http://blog.csdn.net/sbsujjbcy/article/details/50523623 Okio库是一个由square公司开发的,它补充了java.io和java.nio ...

  6. nyoj--747--蚂蚁的难题(三)(dp背包)

    蚂蚁的难题(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:4 描述 蚂蚁终于把尽可能多的食材都搬回家了,现在开始了大厨计划. 已知一共有 n 件食材,每件食材有一个美味度  ...

  7. Re:从0开始的微服务架构:(一)重识微服务架构--转

    原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_ ...

  8. yum概述配置

    YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...

  9. 解决Mysql报错:PHP Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.

    最近我更新了appserv-win32-2.5.10的 PHP 5.2版本到PHP 5.3,在调用http://localhost/phpMyAdmin/时,出现如下错误:PHP Warning:   ...

  10. 安装Windows服务方法

    用sc create 服务名 binPath="路径",不要用老方法InstallUtil会出现一堆的错误