java Future用法和意义一句话击破 [转]

在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。
所以run的返回值是void类型。

如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。

但后者需要前者的结果,就需要用callable接口了。

callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。

线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。

这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。

下面三段简单的代码可以很简明的揭示这个意思:

runnable接口实现的没有返回值的并发编程。

callable实现的存在返回值的并发编程。(call的返回值String受泛型的影响)

同样是callable,使用Future获取返回值。

贴一个完整可运行的程序代码 FutureTest.java

package demo.future;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * 试验 Java 的 Future 用法
 */
public class FutureTest {

    public static class Task implements Callable<String> {
        @Override
        public String call() throws Exception {
            String tid = String.valueOf(Thread.currentThread().getId());
            System.out.printf("Thread#%s : in call\n", tid);
            return tid;
        }
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        List<Future<String>> results = new ArrayList<Future<String>>();
        ExecutorService es = Executors.newCachedThreadPool();
        for(int i=0; i<100;i++)
            results.add(es.submit(new Task()));

        for(Future<String> res : results)
            System.out.println(res.get());
    }

}
时间: 2024-10-30 01:35:31

java Future用法和意义一句话击破 [转]的相关文章

Java 泛型 Java使用泛型的意义

Java 泛型 Java使用泛型的意义 @author ixenos 直接意义 在编译时保证类型安全 根本意义 a) 类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板 b) 使用复用性模板时不用手动强制类型转换 三种泛型实现方式的优缺点 C++:模板方式实现,在编译时完全展开并且支持偏特化,类型精度高,代码共享差: Java 5:擦除方式实现,仅用于编译时类型检查,在运行时擦除,向后兼容性好,代码共享好,类型精度非常差: C# 2.0:混合方式实现,在运行时展开特化,类型精度高,

Java Future

java jdk里面的线程池蛮好用的,之前看的时候忽略掉了一个很好玩的类Future, 顺便记录一下, 这方面的博客很多,就不多说了 java Future 设计模式:http://www.2cto.com/kf/201411/351903.html javaFuture ExecutorService: http://blog.csdn.net/wei369924173/article/details/7992642 java线程池:http://my.oschina.net/u/139830

Java Future模式实现

Java Future模式简介 Future模式是Java多线程常用的模式,而且JDK也内置对Future模式的支持,比如在java.util.concurrent包下的FutureTask类.其核心思想在于:发出请求后,可以立即返回对象,但是这个对象实际上是个假对象,并不可立即使用,但是我们可以在干点别的事情后,就可以使用这个假对象获取结果了.这是为什么呢?因为在返回假对象的时候,偷偷的开启了一个线程去请求真正的结果数据.那么下面,我们来模拟实现下Future模式. 代码实现与分析 主流程是:

java中final的意义

1.如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间. 2.final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于object reference时,final仅让reference保持不变.也就是说当reference一旦被初始化用于代表某个对象时,便再也不能改变指向另一个对象,但对象本身的内容确实可以改变的.final对array的作用和对reference的作用一样.参考以下例子: public class

从Java future 到 Guava ListenableFuture实现异步调用

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51232004 前言 随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂.针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三方接口.通常,我们处理方法是让代码同步顺序的去调取这些接口.显然,调取接口数量的增加必然会造成响应时间的增加,势必会对系统性能造成一定影响. 为

java Future FutureTask 并发操作

1.1 综述 创建线程有两种方式:extends Thread || inplements Runable,但是这两种方式都有一个缺陷,就是执行完任务后不能获取执行结果. 如果非要获取到执行结果的话,就必须通过共享变量或者是线程通信的方法来达到效果,使用较为麻烦,为了解决这种问题,java提供了Callable Future ,通过他们可以再任务执行完毕后得到任务执行结果. 1.2 Runable Callable 对比 java.lang.Runable是一个接口,声明了run()方法: pu

java future模式 所线程实现异步调用(转载

java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场的“期权”,是“对未来的一种凭证”,例如当我们买了某个房地产开发商的期房,交钱之后,开发商会给我们一个凭证(期权),这个凭证告诉我们等明年某个时候拿这个凭证就可以拿到我们所需要的房子,但是现在房子还没建好.市场上之所以有“期货”,也正由于有这种需求,才有这种供给. 这种应用在GUI上用的比较多,在设

从Java Future到Guava ListenableFuture实现异步调用

原文地址: http://blog.csdn.net/pistolove/article/details/51232004 Java Future ????通过Executors可以创建不同类似的线程池,常见的大概有下表几种类型,还有些可能为被列出.在实际应用中,个人感觉主要使用newCachedThreadPook和newFixedThreadPool来创建线程池. Executors创建线程池源码 //调用newCachedThreadPool方法,可以创建一个缓冲型线程池,而在改方法中通过

Java向上转型的意义

1 比如我这个程序 2 public class Testjava{ 3 public static void main(String args[]) 4 { 5 fun(new Student()); 6 fun(new Allen()); 7 8 } 9 public static void fun(Person p) 10 { 11 p.fun2(); 12 if (p instanceof Student) 13 { 14 Student s=(Student)p; 15 s.fun3(