在并发编程时,一般使用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> {@Overridepublic 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());}}

Future接口,一般都是取回Callable执行的状态用的。其中的主要方法:

  • cancel,取消Callable的执行,当Callable还没有完成时
  • get,获得Callable的返回值
  • isCanceled,判断是否取消了
  • isDone,判断是否完成

用Executor来构建线程池,应该要做的事:

1).调用Executors类中的静态方法newCachedThreadPool(必要时创建新 线程,空闲线程会被保留60秒)或newFixedThreadPool(包含固定数量的线程池)等,返回的是一个实现了ExecutorService 接口的ThreadPoolExecutor类或者是一个实现了ScheduledExecutorServiece接口的类对象。

2).调用submit提交Runnable或Callable对象。

3).如果想要取消一个任务,或如果提交Callable对象,那就要保存好返回的Future对象。

4).当不再提交任何任务时,调用shutdown方法

java Future用法相关推荐

  1. java future用法_Java中的多线程知识点

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  2. java future用法_纯干货:Java学习过程中的21个知识点和技术点

    我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...

  3. java future用法_你必须掌握的 21 个 Java 核心技术

    作者:工程师-搁浅来源:https://www.jb51.net/article/122070.htm 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知 ...

  4. java future 不足_java Future用法和意义一句话击破

    在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是void类型. 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使 ...

  5. Future 用法详解

    Future 用法详解 前言 其他知识点 Java 多线程基础 深入理解aqs ReentrantLock用法详解 深入理解信号量Semaphore 深入理解并发三大特性 并发编程之深入理解CAS 深 ...

  6. java resume过时方法_学点开发|关于Java多线程用法解析

    在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...

  7. boost::fibers::future用法的测试程序

    boost::fibers::future用法的测试程序 实现功能 C++实现代码 实现功能 boost::fibers::future用法的测试程序 C++实现代码 #include <cst ...

  8. java正则表达式用法示例_Java正则表达式教程及示例

    java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...

  9. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

最新文章

  1. 使用Python,OpenCV读取视频的每一帧,修改后写入视频
  2. Android实时获取音量(单位:分贝)
  3. 2015.07.20MapReducer源码解析(笔记)
  4. UESTC_摩天轮 2015 UESTC Training for Dynamic ProgrammingProblem K
  5. Arduino终于支持代码补全了!小白们终于可以愉快的写代码了!Arduino IDE 2.0beta功能简介...
  6. 「数据库系列三」磁盘、内存和带宽
  7. 计算机视觉:图像分类定位(单一目标检测)python实现
  8. tensorflow中的正则化解决过拟合问题
  9. microsoft store更新不动_App Store顶尖笔记软件大更新!快来看看有何不同!(文末有福利)...
  10. uCOS中任务调度时的上下文切换
  11. 和vs版本关系_栈局部变量优化探究,意外发现了 vs 的一个 bug ?
  12. 读取excel并将其转换为xml
  13. 2019年10月数据库流行度排行:国产数据库鲲鹏正举 PostgreSQL同比增幅第一
  14. 大学生个人网站作业 超简单DIV CSS个人网页成品 简单个人网站作业模板 HTML个人网页设计下载 简约黑白色个人主页
  15. Android使用SurfaceView开发《捉小猪》小游戏 (一)
  16. ios 高德获取定位_单次定位-获取位置-开发指南-iOS 定位SDK | 高德地图API
  17. Python可视化扩展库Matplotlib中使用参数cmap实现颜色映射
  18. TypeError: Cannot read property 'xxxx' of undefined报错的情况分析
  19. 安卓接入微信php处理,PHP对接微信公众号实现简单自动回复
  20. aso是做什么的_ASOer的目标

热门文章

  1. ASP .NET Core MVC 过滤器之一 ActionFilterAttribute
  2. 订书机外壳注射模设计(设计说明书+CAD图纸)
  3. 【Phoenix】 ERROR 726 (43M10): Inconsistent namespace mapping properties.
  4. linux获取sata端口,配置 SATA 端口时,可能无法使用 Linux* 5.1 检测到 SATA DVD-ROM
  5. 基于一个电商交易数据分析项目的浅析
  6. VR+全景播放器+头控讲解-05
  7. 委以重用的意思_形容要委以重用的诗句
  8. AutoCAD消息:无写入权限。无法创建 acad.cuix(南方测绘CASS11.0)
  9. 都工作两年了,还不知道浮点数如何转二进制?
  10. 关于keil 官网下载芯片包速度太慢的问题