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> {@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用法相关推荐
- java future用法_Java中的多线程知识点
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- java future用法_纯干货:Java学习过程中的21个知识点和技术点
我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...
- java future用法_你必须掌握的 21 个 Java 核心技术
作者:工程师-搁浅来源:https://www.jb51.net/article/122070.htm 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知 ...
- java future 不足_java Future用法和意义一句话击破
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是void类型. 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使 ...
- Future 用法详解
Future 用法详解 前言 其他知识点 Java 多线程基础 深入理解aqs ReentrantLock用法详解 深入理解信号量Semaphore 深入理解并发三大特性 并发编程之深入理解CAS 深 ...
- java resume过时方法_学点开发|关于Java多线程用法解析
在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...
- boost::fibers::future用法的测试程序
boost::fibers::future用法的测试程序 实现功能 C++实现代码 实现功能 boost::fibers::future用法的测试程序 C++实现代码 #include <cst ...
- java正则表达式用法示例_Java正则表达式教程及示例
java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...
- java list用法_Java List 用法详解及实例分析
Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...
最新文章
- 使用Python,OpenCV读取视频的每一帧,修改后写入视频
- Android实时获取音量(单位:分贝)
- 2015.07.20MapReducer源码解析(笔记)
- UESTC_摩天轮 2015 UESTC Training for Dynamic ProgrammingProblem K
- Arduino终于支持代码补全了!小白们终于可以愉快的写代码了!Arduino IDE 2.0beta功能简介...
- 「数据库系列三」磁盘、内存和带宽
- 计算机视觉:图像分类定位(单一目标检测)python实现
- tensorflow中的正则化解决过拟合问题
- microsoft store更新不动_App Store顶尖笔记软件大更新!快来看看有何不同!(文末有福利)...
- uCOS中任务调度时的上下文切换
- 和vs版本关系_栈局部变量优化探究,意外发现了 vs 的一个 bug ?
- 读取excel并将其转换为xml
- 2019年10月数据库流行度排行:国产数据库鲲鹏正举 PostgreSQL同比增幅第一
- 大学生个人网站作业 超简单DIV CSS个人网页成品 简单个人网站作业模板 HTML个人网页设计下载 简约黑白色个人主页
- Android使用SurfaceView开发《捉小猪》小游戏 (一)
- ios 高德获取定位_单次定位-获取位置-开发指南-iOS 定位SDK | 高德地图API
- Python可视化扩展库Matplotlib中使用参数cmap实现颜色映射
- TypeError: Cannot read property 'xxxx' of undefined报错的情况分析
- 安卓接入微信php处理,PHP对接微信公众号实现简单自动回复
- aso是做什么的_ASOer的目标
热门文章
- ASP .NET Core MVC 过滤器之一 ActionFilterAttribute
- 订书机外壳注射模设计(设计说明书+CAD图纸)
- 【Phoenix】 ERROR 726 (43M10): Inconsistent namespace mapping properties.
- linux获取sata端口,配置 SATA 端口时,可能无法使用 Linux* 5.1 检测到 SATA DVD-ROM
- 基于一个电商交易数据分析项目的浅析
- VR+全景播放器+头控讲解-05
- 委以重用的意思_形容要委以重用的诗句
- AutoCAD消息:无写入权限。无法创建 acad.cuix(南方测绘CASS11.0)
- 都工作两年了,还不知道浮点数如何转二进制?
- 关于keil 官网下载芯片包速度太慢的问题