Callable和Future

Future模式

Future接口是Java线程Future模式的实现, 可以来进行异步计算

Callable负责产生结果, Future负责取结果

可以这样解释:

我有一个任务, 提交给了Future, Future则通知Callable替我完成这个任务, 期间我自己可以去做任何想做的事情. 一段时间之后, 就可以从Future那儿取出结果

Callable和Future接口

Callable接口

Callable接口类似于Runnable,但是Runnable不会返回结果,而Callable可以返回结果,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值

/**
 * Computes a result, or throws an exception if unable to do so.
 *
 * @return computed result
 * @throws Exception if unable to compute a result
 */
V call() throws Exception; 

Future接口

Future接口有如下几个方法:

1. 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束

boolean cancel(boolean mayInterruptIfRunning)

2. 任务是否已经取消,任务正常完成前将其取消,则返回 true

boolean isCancelled() 

3. 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true

boolean isDone() 

4. 等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException

V get()

5. 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计算超时,将抛出TimeoutException

V get(long timeout, TimeUnit unit) 

Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果。也可以设置任务执行的超时时间,这个设置超时的方法就是实现Java程序执行超时的关键。

所以,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。

int result = future.get(5000, TimeUnit.MILLISECONDS);

下面演示Callable和Future的基本使用方法:

 1 public class Test {
 2
 3     public static void main(String[] args) {
 4         ExecutorService threadPool = Executors.newSingleThreadExecutor();
 5         Future<String> future =
 6             threadPool.submit(
 7                     new Callable<String>(){
 8                         public String call() throws Exception {
 9                             Thread.sleep(2000);
10                             return "shen_smile";
11                         }
12             });
13         System.out.println("等待结果");
14         try {
15             System.out.println("拿到结果 " + future.get());
16         } catch (InterruptedException | ExecutionException e) {
17             // TODO Auto-generated catch block
18             e.printStackTrace();
19         }
20     }
21 }

本文引用了部分http://blog.csdn.net/vking_wang/article/details/9470499 中的内容

时间: 2024-10-10 04:23:52

Callable和Future的相关文章

Java并发编程:Callable、Future和FutureTask(转)

Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callabl

Callable、Future和FutureTask浅析

我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从JAVA SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果,今天我们就来聊聊线程创建的第三种方式,那就是实现Callable接口. 1.Callabl

【转】Java线程系列:Callable和Future

一.前言 在研究JDK1.8的CompletableFuture时,顺道将Futrue一起扫了盲~这篇博文纯转载 二.正文 本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果.        Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值

Callable, Runnable, Future, FutureTask

Java并发编程之Callable, Runnable, Future, FutureTask Java中存在Callable, Runnable, Future, FutureTask这几个与线程相关的类或接口, 下面来了解一下它们的作用和区别. 一.Callable和Runnable Callable和Runnable类似, 实现Callable和Runnable接口的类都是可以被其他线程运行的任务, Callable和Runnable主要有以下几点区别: (1). Callable中声明的

Callable、Future和FutureTask

Runnable是执行工作的独立任务,但是它不返回任何值,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦.自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 一.Runnable java.lang.Runnable是一个接口,在它里面只声明了一个run()方法: 由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果. 二.Callable Callable位

Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask

CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier.CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作.看一下CyclicBarrier的使用实例: public static class CyclicBarrierThread extends Thread { private CyclicBarrier cb; private int sleep

[转载] Java并发编程:Callable、Future和FutureTask

转载自http://www.cnblogs.com/dolphin0520/p/3949310.html 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果.

Callable与Future的介绍

Callable与 Future 两功能是Java在后续版本中为了适应多并发才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务. Callable的接口定义如下: public interface Callable<V> { V call() throws Exception; } Callable和Runnable的区别如下: I    Callable定义的方法是call,而Runnable定义的方法是

java多线程技术之(callable和future)

接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子: 1 public class CallableAndFuture { 2 publ

Java - &quot;JUC线程池&quot; Callable与Future

Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一对组合.当我们需要获取线程的执行结果时,就需要用到它们.Callable用于产生结果,Future用于获取结果. 1. Callable Callable 是一个接口,它只包含一个call()方法.Callable是一个返回结果并且可能抛出异常的任务. 为了便于理解,我们可以将Callable比作一个Runnable接