java.util.concurrent.Future基础

在此,我开始撰写一系列有关编程语言中的未来概念(也称为promisedelays )的文章,标题为: Back to the Future 。 由于对异步,事件驱动,并行和可伸缩系统的需求不断增长,所以期货是非常重要的抽象,如今比以往任何时候都更加重要。 在第一篇文章中,我们将发现最基本的java.util.concurrent.Future<T>接口。 稍后,我们将跳入其他框架,库甚至语言。 Future<T>是相当有限的,但必须了解,ekhm,将来部分。

在单线程应用程序中,当您调用方法时,它仅在计算完成IOUtils.toString()返回( IOUtils.toString()来自Apache Commons IO ):

public String downloadContents(URL url) throws IOException {try(InputStream input = url.openStream()) {return IOUtils.toString(input, StandardCharsets.UTF_8);}
}//...final String contents = downloadContents(new URL("http://www.example.com"));

downloadContents()看起来是无害的1 ,但它甚至可能需要花费很长时间才能完成。 此外,为了减少延迟,您可能希望在等待结果的同时进行其他独立的处理。 在过去,您将启动一个新Thread并以某种方式等待结果(共享内存,锁,可怕的wait() / notify()对等),使用Future<T>会更加愉快:

public static Future<String> startDownloading(URL url) {//...
}final Future<String> contentsFuture = startDownloading(new URL("http://www.example.com"));
//other computation
final String contents = contentsFuture.get();

我们将很快实现startDownloading() 。 目前,重要的是要了解这些原理。 startDownloading() 阻塞,等待外部网站。 相反,它会立即返回,并返回轻量级的Future<String>对象。 此对象保证 String将来会可用。 不知道什么时候,但是保留此引用,一旦存在,您就可以使用Future.get()检索它。 换句话说, Future是一个尚未存在的对象的代理或包装。 异步计算完成后,您可以提取它。 那么Future提供了什么API?

Future.get()是最重要的方法。 它阻塞并等待,直到承诺的结果可用(已解决 )。 因此,如果我们确实需要该String ,则只需调用get()并等待。 有一个过载的版本可以接受超时,所以一旦出现问题,您将不会永远等待。 如果等待时间太长,则会抛出TimeoutException

在某些用例中,您可能希望窥视“ Future ,如果结果尚不可用,请继续。 使用isDone()可以做到这一点。 想象一下这样一种情况,您的用户正在等待一些异步计算,而您想让他知道我们仍在等待并同时进行一些计算:

final Future<String> contentsFuture = startDownloading(new URL("http://www.example.com"));
while (!contentsFuture.isDone()) {askUserToWait();doSomeComputationInTheMeantime();
}

到最后调用contentsFuture.get()是保证立即返回,而不是因为块Future.isDone()返回true 。 如果遵循上述模式,请确保您不忙于等待,每秒每秒调用isDone()数百万次。

取消期货是我们尚未讨论的最后一个方面。 想象一下,您开始了一些异步作业,并且您只能在给定的时间内等待它。 如果2秒钟后仍没有出现,我们会放弃并传播错误或解决它。 但是,如果您是一个好公民,您应该以某种方式告诉这个未来的目标:我不再需要您,那就算了。 通过不运行过时的任务来节省处理资源。 语法很简单:

contentsFuture.cancel(true);    //meh...

我们都喜欢神秘的布尔参数,不是吗? 取消有两种口味。 通过将false传递给mayInterruptIfRunning参数,当Future表示尚未开始的计算结果时,我们仅取消尚未开始的任务。 但是,如果我们的Callable.call()已经在中间,则让它结束。 但是,如果我们传递true ,则Future.cancel()将更具攻击性,并尝试中断已经在运行的作业。 怎么样? 考虑所有引发臭名昭著的InterruptedException方法,即Thread.sleep()Object.wait()Condition.await()以及许多其他方法(包括Future.get() )。 如果您禁止使用任何此类方法,而某人决定取消您的Callable ,则它们实际上将抛出InterruptedException ,表示有人试图中断当前正在运行的任务。

因此,我们现在了解什么是Future<T> –将来会得到的东西的占位符。 这就像尚未生产的汽车的钥匙。 但是,实际上如何在应用程序中获取Future<T>的实例? 两种最常见的来源是线程池和异步方法(由您的线程池支持)。 因此,我们的startDownloading()方法可以重写为:

private final ExecutorService pool = Executors.newFixedThreadPool(10);public Future<String> startDownloading(final URL url) throws IOException {return pool.submit(new Callable<String>() {@Overridepublic String call() throws Exception {try (InputStream input = url.openStream()) {return IOUtils.toString(input, StandardCharsets.UTF_8);}}});
}

语法很多,但基本思想很简单:将长时间运行的计算包装在Callable<String>然后submit()它们submit()到10个线程的线程池中。 提交返回Future<String>某些实现,最有可能以某种方式链接到您的任务和线程池。 显然,您的任务不会立即执行。 而是将其放置在队列中,该队列稍后(甚至可能更晚)由池中的线程轮询。 现在应该清楚这两种cancel()含义–您始终可以取消仍然驻留在该队列中的任务。 但是取消已经运行的任务要复杂一些。

可以遇到Future另一个地方是Spring和EJB。 例如,在Spring框架中,您可以使用@Async注释您的方法 :

@Async
public Future<String> startDownloading(final URL url) throws IOException {try (InputStream input = url.openStream()) {return new AsyncResult<>(IOUtils.toString(input, StandardCharsets.UTF_8));}
}

注意,我们只是将结果包装在实现Future AsyncResult 。 但是该方法本身不处理线程池或异步处理。 Spring稍后将代理所有对startDownloading()调用,并在线程池中运行它们。 EJB中的@Asynchronous批注提供了完全相同的功能。

因此,我们了解了很多有关java.util.concurrent.Future 。 现在该承认了–该界面非常有限,尤其是与其他语言相比时。 以后再说。

1 –您不熟悉Java 7的try-with-resources功能吗? 您现在最好切换到Java 7。 Java 6将在两周内不再维护。

参考: NoBlogDefFound博客上来自我们的JCG合作伙伴 Tomasz Nurkiewicz的java.util.concurrent.Future基础 。

翻译自: https://www.javacodegeeks.com/2013/02/java-util-concurrent-future-basics.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaweb(三十七)——获得MySQL数据库自动生成的主键

测试脚本如下&#xff1a; 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码&#xff1a; 1 package me.gacl.demo;2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; …

如何隐藏 video 元素的下载按钮

1. 使用 video 元素的 ControlList API <video controls controlsList"nodownload"></video> 通过 ControList API&#xff0c;不仅可以通过设置 nodownload 来隐藏下载按钮&#xff0c;还可以设置 nofullscreen 隐藏全屏按钮, 以及noremoteplayback 等…

基于Matlab的模拟通信实验平台设计,【通信原理仿真实验】通信原理虚拟实验仿真平台的设计和实现_玛雅作文网...

作文「通信原理虚拟实验仿真平台的设计和实现」共有 4564 个字&#xff0c;其中有 2704 个汉字&#xff0c;1316 个英文&#xff0c;162 个数字&#xff0c;382 个标点符号。作者佚名&#xff0c;请您欣赏。玛雅作文网荟萃众多优秀学生作文&#xff0c;如果想要浏览更多相关作文…

2018/3/1 省选模拟考试 50分

T1 30分模拟暴力&#xff0c;40分树的直径。拿了0分。&#xff08;空间开小了爆了&#xff0c;因为缩点之后是又建了一次图&#xff0c;两个边的编号tot没分开&#xff0c;mdzz&#xff09; 只写了后40分&#xff0c;而这40分中有20分不需要边双连通分量。写了一个类似于强连通…

DNS缓存服务器的配置步骤

yum安装bind 编辑主配置文件/etc/named.conf 修改全局配置文件段 listen-on port 53 {172.16.19.45;}; //allow-query dnssec-enable no ; dnssec-validation no; dnssec-lookaside no; 检查配置文件是否修改正确 named-checkconf /etc/named.conf 重启na…

信号与系统 徐亚宁 matlab程序,信号与系统(第4版)

第1章绪论11信号与系统12信号的描述与分类13系统的描述与分类131连续时间LTI系统及其描述132离散时间LTI系统及其描述14系统的基本特性15信号与系统分析方法概述16MATLAB 基本知识161MATLAB简介162MATLAB快速入门本章学习指导习题上机练习第2章连续…

骆驼和春天的Drools决策表

正如我在之前的文章中所展示的那样&#xff0c; JBoss Drools是一个非常有用的规则引擎 。 唯一的问题是&#xff0c;对于非技术人员而言&#xff0c;以Rule语言创建规则可能会非常复杂。 这就是为什么可以提供一种轻松的方式来创建业务规则的方法-在电子表格中创建决策表&…

UA记录

安卓QQ内置浏览器UA: Mozilla/5.0 (Linux; Android 5.0; SM-N9100 Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 V1_AND_SQ_5.3.1_196_YYB_D QQ/5.3.1.2335 NetType/WIFI 安卓微信内置浏览器UA: Mozilla/5.0 (Linu…

酷炫,用Html5/CSS实现文字阴影

前两天有一个学html5前端小美女问我一个有关文字阴影的效果怎么去实现。她和我说文字阴影嘛,她也知道text-shadow,.但是却做不出想要的样子,其实css3的新功能是很强大的,不要把你的思想太过于局限化,好了,闲话也不多说,咱们就先来看看这个文本阴影. 一.文字阴影text-shadow 文…

从xtrabackup备份恢复单表【转】

目前对MySQL比较流行的备份方式有两种&#xff0c;一种上是使用自带的mysqldump&#xff0c;另一种是xtrabackup&#xff0c;对于数据时大的环境&#xff0c;普遍使用了xtrabackupbinlog进行全量或者增量备份&#xff0c;那么如何快速的从xtrabackup备份中恢复单张表呢&#xf…

Java:放心(或非常容易)

最近&#xff0c;我不得不编写一些Java代码以通过HTTP 使用 REST服务 。 我决定使用RestEasy的客户端库&#xff0c;该框架是我大部分时间用来公开Java REST服务的框架&#xff0c;因为它也实现了官方的JAX-RS规范。 我对规范定义的注释驱动方法非常满意&#xff0c;这使REST服…

php输出json到表格,PHP中把数据库查询结果输出为json格式

header("Content-type:text/html;charsetutf-8");//字符编码设置$servername "localhost";$username "root";$password "root";$dbname "tjks";// 创建连接$con mysqli_connect($servername, $username, $password, $db…

CSS中的overflow属性

overflow属性 如果元素中的内容超出了给定的宽度和高度属性&#xff0c;overflow 属性可以确定是否显示滚动条&#xff0c;是否隐藏溢出部分等行为&#xff0c;规定当内容溢出元素框时发生的事情。 可能的值有&#xff1a; visible&#xff1a;默认值。内容不会被修剪&#xff…

COGS 13. 运输问题4

★★☆ 输入文件&#xff1a;maxflowd.in 输出文件&#xff1a;maxflowd.out 简单对比时间限制&#xff1a;1 s 内存限制&#xff1a;128 MB 【问题描述】一个工厂每天生产若干商品&#xff0c;需运输到销售部门进行销售。从产地到销地要经过某些城镇&#xff0c;有不同…

Java –手工Classloader隔离

在最近的项目中&#xff0c;我们遇到了一个典型的库冲突问题 。 我们可以控制的一个组件需要特定版本的Apache Commons库&#xff0c;而另一个组件则需要一个不同的版本。 由于外部限制&#xff0c; 我们无法在Container级别指定任何类加载隔离 。 这不是我们的选择。 相反&…

【知识梳理1】Android触摸事件机制

前言 随着科学技术的发展&#xff0c;智能手机早已成为我们当代人身边不可缺少的“伙伴”之中的一个&#xff0c;堪比对象女友。每天我们对着手机反复的做着点击、滑动操作&#xff0c;而手机则随着我们的操作给我们展示她的精彩。… 废话到此结束。 看到这里&#xff0c;即使…

matlab if m不等于0,matlab问题clearfor a=0.1:0.1:50for b=0.1:0.1:20for m=0.1:0.1:5

来源&#xff1a;学生作业帮 编辑&#xff1a;作业帮 分类&#xff1a;综合作业 时间&#xff1a;2021/03/23 06:16:09matlab问题clearfor a0.1:0.1:50for b0.1:0.1:20for m0.1:0.1:5for k1:1:15n(a*m)/(2*b)-m^2;z4*k-a*m;x(4*k-a*m)/(4*k-2*b*(m^2n));y(4*k-a*m)/(4*k-2*b*m^…

自己做的一个登录页面,纯代码!

先上效果图吧. 本人菜鸟入门, 请勿喷. 首先样式: 1 1 body{2 2 margin: 0;3 3 padding: 0;4 4 width: 100%;5 5 height: 100%;6 6 }7 7 8 8 .headers{9 9 width: 100%;10 10 height: 100px;11 11 }12 12 .siv-ng{13 13 width:…

ASP.NET调用cmd命令提示符拒绝访问解决方案

using System.Diagnostics; public class CmdHelper{private static string CmdPath "C:\Windows\System32\cmd.exe";/// <summary>/// 执行cmd命令/// 多命令请使用批处理命令连接符&#xff1a;/// <![CDATA[/// &:同时执行两个命令/// |:将上一个命…

Java 7:Fork / Join框架示例

Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计&#xff0c;并将这些任务的结果组合起来以产生最终结果。 通常&#xff0c;使用Fork / Join Framework的类遵循以下简单算法&#xff1a; // pseudocode Result solve(Problem problem) {if (problem.size &…