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. js基础——事件绑定(事件监听)

    JavaScript事件一共有三种监听方法分别如下: 1.事件监听一夹杂在html标签内 <div id="box" onClick="alert('HELLO W ...

  2. jQuery fadeOut无效

    $(this).fadeOut("fast"), var nowele = $(this); nowele.fadeOut("fast")

  3. HDU 4303 Contest 1

    说实话,挺复杂的一道题. 我采用栈的方式,DFS在搜索完一个节点的所有子结点后,通过排序,加快计算该结点所有可能的路径:子结点与子结点的连通,子结点与父结点的连通,通过父结点与各祖先结点的连通.同时记 ...

  4. MySQL高可用系列之MHA(二)

    一.參数说明 MHA提供了一系列配置參数.深入理解每一个參数的详细含义,对优化配置.合理使用MHA非常重要.非常多高可用性也都是通过合理配置一些參数而实现的. MHA包含例如以下配置參数,分别说明例如 ...

  5. Android应用常规开发技巧——善用组件生命周期

    数据管理 对于仅仅读数据.一种经常使用的管理模式是在onCreate函数中进行数据的载入,直到组件的onDestory函数被调用时在进行释放. // 缓存仅仅读的数据 private Object r ...

  6. Microsoft Updateclient更新

     大家好, 微软Microsoft Update产品组官方博客于昨天宣布了有关最新的Windows Updateclient更新的消息.依据这则博客.微软从当日開始逐渐向全部Windows 7, ...

  7. OS - 线程和进程的差别

    进程是资源分配的基本单位,又是调度执行的基本单位.比如.用户执行自己的程序,系统就创建一个进程.并为它分配资源,包含各种表.内存空间.磁盘空间.I/O设备等. 然后.把该进程放入进程的就绪队列.进程调 ...

  8. STM32F407VG (四)时钟配置

    1.STM32 F407VG 的starup_stm32f40_41xxx.s的例如以下位置调用 IMPORT SystemInit,之后调用main函数,所以 进入main函数时候就已经自己主动完毕 ...

  9. hibernate之4.延迟载入

    延迟载入: 仅仅有当使用以实体对象的属性(除主键属性外)时,才会发送查询语句到数据库 get不支持延迟载入 @Test public void getTest(){ Session session=n ...

  10. 使用Swing组件编写一个支持中文文本编辑程序ChineseTextEdit.java

      import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; public class C ...