并发包之Future:代码级控制超时时间

BUUCTF reverse题解汇总 BUUCTF平台刷题过程中做的一些逆向题解的总结归类 阅读详情

先谢Doug Lea。


使用场景:

最近在做webservice调用的时候,发现一个问题,对方的webservice接口很不稳定,所以在获取的数据时候经常要等待很久才能把数据全部拉回来,甚至有时候直接就抛异常了,这种阻塞很耗费时间,性能很低。针对这种情况,我需要将一定时间内没有返回结果的调用KILL掉,于是用到了并发包Future,实现并在生产环境运行良好。

============================================================

2015-07-13修改备注:

1、之前的代码存在executor没有关闭的异常;

2、对新来的朋友提个建议,频繁创建single线程池不是一个好建议。我之前的场景并发很低,看不出问题。随着现在接触的业务并发变得很大,根本不会这么写了,因为频繁的创建关闭线程会浪费很多资源。并发很小的情况,并且必须要控制超时时间的情况下可以试试。

很抱歉,本人阅历有限,希望没对读者造成影响。

============================================================

测试代码如下,自行体会:



package com.array7.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class FutureTest {
	public static void main(String[] args) {
		String result = ControlTimeOut.call(new CallableImpl("OK"));
		System.out.println(result);
		result = ControlTimeOut.call(new CallableImpl("NO OK!"));
		System.out.println("result=" + result);
	}
}
class ControlTimeOut {
	@SuppressWarnings("unchecked")
	public static <T> T call(Callable<T> callable) {
		ExecutorService executor = Executors.newCachedThreadPool();
		Future<T> future = executor.submit(callable);
		try {
			T t = future.get(3000, TimeUnit.MILLISECONDS);
			executor.shutdwon();
			return t;
		} catch (InterruptedException e) {
			System.out.println("InterruptedException");
		} catch (ExecutionException e) {
			System.out.println("ExecutionException");
		} catch (TimeoutException e) {
			// TODO: coding here...
			System.out.println("TimeoutException");
		}
		return null;
	}
	
}

class CallableImpl implements Callable<String> {
	private static final String CORRECT_KEY = "OK";
	private String key = "";

	public CallableImpl(String key) {
		this.key = key;
	}
	
	public String call() {
		// TODO:真正的业务逻辑
		if (CORRECT_KEY.equals(this.getKey())) {
			return "SUCCESS";
		} else {
			try {
				Thread.sleep(5000);	// 阻塞。设置5秒超时,为了Future抛出TimeoutException
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return "FAIL";
		}
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}
}

RH850从0搭建Autosar开发环境【1】- 如何创建Davinci Configurator配置工程 当我们在公司接触Autosar开发环境时,基本都是完整的Davinci Configurator的配置工程,我们只能修修补补。 从本章开始将手把手搭建Rh850基于Vector公司Davinci Configurator的autosar配置工程。主要涉及到OS,COM,DCMM,NVM,BSWM,ECUM等基本模块,包括Vlink,memap使用,XCP标定的实现等。基本是实现一个基础版的项目开发。包括后期的GreenHills编译问题处理,生成最终的Hex文件。 阅读详情

相关推荐

电动转向系统 TAS 传感器

靠扭杆变形测力气,用霍尔效应算角度,借 ECU 给电机发指令。它就像 EPS 系统的 "神经末梢",把驾驶员的操作意图转化成电信号,再通过电机变成实实在在的助力,让我们开车既省力又安全。下次转动方向盘时,不妨想想这个藏在转向柱里的 "小传感器"—— 正是它的精准感知,才有了每一次顺畅的转向体验。

weixin_59825476的博客 4297

线程 sleep 取消_java多线程开发理解Future和FutureTask的使用,任务启动与取消

在多线程开发中,我们经常用到的一个是Thread类,或Runnable接口,但他们不太方便返回执行的结果,所以这里介绍一个新的类,它即能达到多线程异步执行的目标,还能方便的得到结果,这个类就是Callable类。下面我们主要通过代码学习具体的使用,关键部分都在代码中作了注释。代码:MyCallableTask.java自定义一个类MyCallableTask,该类继承Callable接口,我们重写...

weixin_39719727的博客 379

最详细的Cadence OrCAD Capture自带元件库的介绍

最详细的Cadence OrCAD Capture自带元件库的介绍 本章节将介绍Cadence OrCAD Capture 软件自带的各类元件库的分类,方便大家在设计时能够快速的选择元件。 AMPLIFIER.OLB 共182个零件,存放模拟放大器,IC,如LM386,MAX457等。 ARITHMETIC.OLB 共182个零件...

LGCPCB的博客 6万+

Java线程池详解:Future的使用和实现

java复制代码public class FutureTask implements RunnableFuture { // 为Callable任务生成FutureTask public FutureTask(Callable callable) { if (callable == null) throw new NullPointerException();

bjmsb79的博客 2380

DAGGER vs 传统模仿学习:为什么数据聚合能提升模型性能?

本文深入对比了DAGGER与传统模仿学习,揭示了传统方法因“分布不匹配”导致性能下降的根源。DAGGER通过动态的**数据聚合**机制,在智能体自身策略产生的状态分布上收集专家数据,从根本上解决了误差累积问题,从而显著提升了模型在实际部署中的鲁棒性和性能。

weixin_29170327的博客 235

CAN-do-paser:Java开发的CAN总线数据帧解析库

CAN总线数据帧使用DBC文件信息解析为物理量,基于Java开发的数据解析工具。

佳瑞的博客 1136

线上接口经常超时,我用线程池+ FutureTask解决了

解决方案 用线程池+ FutureTask将1个查询拆分成多个小查询 选择FutureTask是因为它具有仅执行1次run()方法的特性(即使有多次调用也只执行1次),避免了重复查询的可能。而且多任务异步执行也能提高接口响应速度。 本文主要讲的是线程池搭配FutureTask异步执行的例子 一、线程池+FutureTask执行多任务计算 public class Test { //线程池最好作为全局变量, 若作为局部变量记得用完后shutdown() ThreadFactory namedTh

wui66655的博客 564

SAP 移动类型简述

SAP系统中用于标志物料移动(收货/发货/转储/转储记帐)的三位的数字/字母 通常分几大类:收货 发货 转储 库房调整 常用的有: 收货类 (MB1C) 101 采购订单收货 103 采购订单收货至冻结状态 122 无采购订单退货 161 按退货采购订单退货 131 从生产订单 501 无采购订单收货 511 免费收货 发货类(MB1A) 201 成本中心消耗

forever_crazy的专栏 7207

接口耗时太久怎么办?适当用点Future做异步~

在JS中,各种回调函数漫天飞,写的代码基本都是异步的,需要靠某个event去trigger。比如点击事件,就是最常见的。但是Java里面做异步就得绕好几弯,还不一定行,需要各种判断和校验,生怕出错。 异步执行的好处是显而易见的,比如某个接口需要查好几张表,调很多方法,其中有几个方法是非常耗时的。但是很多代码的做法还是同步的,传统的顺序执行。优点是可读性强,不容易出错。 假如A方法耗时特别长的话,那么整合接口的返回就会很慢。 比如,现在有一个服务,非常耗时。 class AccountServi

java小白翻身 1277

机器人导航学习历程(四)local planner

local planner   我们先来回顾一下Navigation的框架,可以看出位于红框中的local_planner是move_base节点的一部分,输入包括来自global_planner的全局的规划路径、里程计信息以及local_costmap的信息,输出是速度控制指令,作为控制器的输入。 base_local_planner   局部规划一般是用base_local_planner包...

yuniruchujian的博客 4413

上海交大计算机保研面试 2026:3类专项计划与10个联培方向深度解析

本文深度解析2026年上海交通大学计算机保研面试的3类专项计划与10个联培方向,包括区块链技术、智能计算系统和网络安全专项,以及蚂蚁科技、苏州智研院等联培基地。文章详细介绍了各专项的核心课程、硬件资源和就业去向,为计算机专业学生提供全面的申请策略和职业发展建议。

weixin_31528001的博客 397

Java中future.get 超时_Java程序执行超时——Future接口介绍

在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实 现,可以来进行异步计算。Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任...

weixin_35577004的博客 4535

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java异步控制方法的超时时间

根据实际需求,选择合适的方式来控制异步方法的超时时间,以提高系统的稳定性和性能。然而,由于异步方法的执行时间无法确定,我们常常需要在一定的时间范围内对方法进行超时控制,以避免长时间的阻塞。我们可以使用 CompletableFuture 的方法来设置超时时间。在上面的示例中,如果异步操作超过 3 秒仍未完成,则会抛出 TimeoutException 异常,我们可以在 catch 块中进行超时处理。在上面的示例中,异步操作的返回值为 “结果”,如果超过 3 秒仍未完成,则将返回 “超时返回值”。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 2050

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++26来了!揭秘std::future新增超时控制的底层实现原理

C++26 std::future 超时控制来了!解决异步任务等待阻塞难题,新增wait_for和wait_until超时机制,适用于网络请求、定时任务等场景,提升程序响应性与稳定性。底层基于高效状态机与计时器集成,值得收藏。

CodeWhim的博客 816

Java程序执行超时——Future接口介绍

在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实 现,可以来进行异步计算。 Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完

HGuang_ZJH的专栏 1万+

【Java并发】线程池多线程调用 限定超时时间的future.get()串行阻塞式运行

线程池多线程任务调用,串行阻塞式运行,虽然慢但稳妥要求单个线程运行时必须要有超时时间,超时则放弃运行下一个任务这里的实现仅能用,不完善Main.java 运行 运行结果:

锥栗的博客 8537

Tokio超时控制:异步操作的时间限制

在异步编程中,未受控制的长时间运行操作可能导致资源泄漏、服务不可用甚至系统崩溃。Tokio(Rust的异步运行时)提供了全面的超时控制机制,让开发者能够精确管理异步任务的执行时长。本文将深入探讨Tokio超时系统的工作原理、核心API及实战应用,帮助你构建更健壮的异步应用。 ## 超时控制的重要性 异步程序中,以下场景特别需要超时保护: - **网络请求**:第三方服务响应延迟或无响应 - ...

gitblog_00416的博客 936

java设置代码执行的超时时间

最近有个需求, 当DB压力过大时获取Connction的时间过慢长时间不返回的话, 就不连接DB了, 研究了好久,DataSource里面的setLoginTimeOut 根本没法用, 刚开始一直纠结在大google搜索"java get connection 超时"答案上, 但始终找不到答案, 偶然尝试了下"java 设置超时" 问题就迎刃而解了. java早已经给我们提供了解决方案。jdk1.5自带的并发库中Future类就能满足这个需求。Future类中重要方法包括get()和cancel()。ge.

3374

java 线程池超时_线程池中如何控制超时时间?

线程池构造方法不能控制任务的超时时间,java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue)long, java.util.concurrent.TimeUnit设置的是超...

weixin_40001634的博客 5700

使用Future停止超时任务

今天学了下多线程中超时任务的处理,这里和大家分享下,遇到了点问题没能解决,留下来希望大家帮我解疑啊。 在JAVA中停止线程的方法有多种,有一种是结合ExecutorService和Future的使用,停止在线程池中超时的任务。这种情况下处理的都是比较耗时的操作,比如请求资源,数据库查询等,当超过一定时间没有返回结果,就结束线程,提高响应速度。 具体步骤如下: 实现Runnable接口或...

掬水月在手,弄花香满衣 569

C++26 std::future超时功能详解(下一代异步编程利器)

C++26 std::future超时功能详解,解决异步任务阻塞难题。支持wait_for、wait_until超时控制,适用于网络请求、定时任务等场景,提升程序响应性与稳定性,是下一代异步编程利器,值得收藏。

StepLens的博客 789

java超时控制

超时控制是我们在系统中容易忽视却又不能忽视的功能。一方面,超时并不是我们系统的主要业务功能,大多数超时控制已经被虚拟机或者服务器实现了;另一方面,超时控制是许多业务必备的隐性功能,试想,一个web应用如果在10秒默认超时过后才响应,客户能够忍受吗?     这篇文章主要总结了一些常见的超时处理机制,以及适用的场景。     首先这里提出一个实际遇到的问题,大家可以思考如何解决。在调用corba

笨狐狸 5262

Spring Boot使用@Async实现异步调用:使用Future以及定义超时

之前连续写了几篇关于使用 @Async实现异步调用的内容,也得到不少童鞋的反馈,其中问题比较多的就是关于返回 Future的使用方法以及对异步执行的超时控制,所以这篇就来...

程序猿DD 6708

java 方法的执行时间监控 设置超时(Future 接口)

在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。 Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成

huidanyige的专栏 1万+

Java 多线程设置线程超时时间之 Callable接口和Future接口 超时控制

Callable接口和Future接口介绍         在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。

yangliuhbhd的博客 7851
上一篇: axis2 webservice 发布、调用与项目集成
下一篇: 数据库事务隔离级别与锁
七郎
博客等级 码龄14年 31粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值