java 可超时的任务管理
问题
最近研究比特币, 从网络上下载区块的时候有时候碰到一个问题: 比特币的网络的请求和响应式是异步, 发送了一个请求无法判断这个请求有没有响应, 为了解决这个问题, 使用超时机制. 如果一起请求发起后, 一段时间没有接受到响应, 就切换到另外一个服务器重新请求, 于是就实现了一个工具类 TimeoutTaskManager
实现说明
通过一个死循环的线程while (true) { ... }
来监听超时, 如果超时则切换到下一个服务器, 如果该线程被中断会直接退出
执行过程
假如有一个任务(Consumer<T> consumer
), 有N台服务器可以支持(public void addProvider(T provider) {
), 当前正在执行的服务如果出现超时的时候(int time, TimeUnit unit
), 自动按照队列(Queue<T> queue
) 顺序尝试, 如果队列里面没有支持者则会一直等待 (waiting.await();
), 直到 addProvider(T provider)
的时候 waiting.signal()
唤醒.
- 构造函数指定 任务和超时时间
public TimeoutTaskManager(Consumer<T> consumer, int time, TimeUnit unit) { ... }
- 添加服务的提供者
public void addProvider(T provider) { ... }
- 移除提供者
public synchronized void remove(T e) { ... }
- 如果是指定的任务是 几个任务的合集, 例如:集合中的任务耗时不同, 可以在完成一个任务后重置任务的超时时间, 所有的操作都必须是当前的提供者才可以修改, 因此有个参数
T me
, 返回值判断是否修改成功
public synchronized boolean touch(T me, long time, TimeUnit unit) { ... }
另外有个几个简单方法, 分别是默认超时时间的10倍和20倍: touchTenFold
, touchTwentyFold
- 有一个断言方法认定当前是自己
assertIsMe
, 如果不是自己会抛出IllegalStateException
的异常
public TimeoutTaskManager<T> assertIsMe(T me, String format, Object... args) throws IllegalStateException { ... }
一些其他方法有用的方法
- 可以添加一个提供者切换时候的监听器, 有时候切换的时候需要做一些清理工作
public TimeoutTaskManager<T> addChangeListeners(BiConsumer<T, T> cn) { ... }
- 如果任务有共享数据可以放置到缓存中, 注意线程安全需要自己保证
public TimeoutTaskManager<T> putCache(String key, Object cache) { ... }
- 还提供了线程的同步的方法, 不会在
doing
的过程中产生provider
的切换, 注意:不要产生死锁
public synchronized TimeoutTaskManager<T> ifMe(T me, Runnable doing) throws IllegalStateException { ... }
详细代码在 Gitee
TimeoutTaskManager
(完)
java 可超时的任务管理相关推荐
- java 设置超时_java线程超时设置方法
对于java中线程超时间可以使用ExecutorService与Timer来控制一个线程什么时候超时了,下面我整理了一些方法,这些文章都详细的介绍java线程超时设置技巧. 方法一 本例子使用Exec ...
- Java多线程超时判断
Java多线程超时判断 应用场景 主要方法 实现代码 应用场景 多线程任务中,个别线程可能发生阻塞,无法正常返回,如果等待全部线程执行完毕,程序将无法正常执行结束.此时需要为多线程设置最大执行时间,超 ...
- java socket超时时间_java中socket 默认超时时间 | 学步园
MS:永远吧 Java代码 connect publicvoidconnect(SocketAddress endpoint, inttimeout) throwsIOException Connec ...
- java订单超时取消设计_quartz框架和关闭超时订单
Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运 ...
- java rmi 超时_java RMI服务超时
Netty的worker线程只负责nio,在收到完整数据后将数据按要求封装并放入到业务数据队列:业务处理类负责从该队列中取出数据并处理. 这里的业务处理类现在是如何实现的?按你的说法,单线程和多线程 ...
- java阻塞超时_JAVA防线程阻塞(超时控制)
2.[代码]TimeoutThread /** * java线程超时控制的实现 * * 超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要 ...
- java http超时重连_httpclient 重连机制
我们在进行http请求时,难免会遇到请求失败的情况,失败后需要重新请求,尝试再次获取数据. Apache的HttpClient提供了异常重试机制,在该机制中,我们可以很灵活的定义在哪些异常情况下进行重 ...
- java事务超时时间,java – 如何在WebSphere Liberty Batch中配置事务超时?
> javax.transaction.global.timeout的作用是什么? >我是否需要在CheckpointAlgorithm中实现checkpointTimeout()方法? ...
- poj java 输入超时_Java:如何实现代码超时功能?
我们写一个有超时功能的 Callable: import java.util.concurrent.*; public class TimeoutCallable implements Callabl ...
最新文章
- C#中DateTime.Now.Ticks的用法和说明
- java 中lock,java中lock获取锁的四种方法
- python 帮助文档、自我解释
- 联想服务器DL388eu盘装系统,服务器价格指导 10月双路机架产品导购
- html5用圆圈画猫,html5的应用-画一个可爱的小猫咪效果图
- linux下使用nginx搭建集群,CentOS(linux) 下Nginx的安装(Nginx+Tomcat集群第一步)
- css垂直水平居中的整理
- lia人是什么意思_老话说“人穷别说话,位卑莫劝人”,什么意思?有何道理?...
- 新增一个主键自增长_使用技巧之——MyBatis如何返回插入主键
- linux退出python环境_Linux中的python虚拟环境
- Windows 10 TH2改进
- 如何成为优秀的技术人员
- ftp服务器登录没有文件,登录ftp服务器文件显示不出
- 『HarmonyOS』万物互联,分布式操作系统
- 学习自媒体究竟要投入多少?
- 永久关闭WPS热点,防止自启动
- 图论中的0x3f和memset使用注意事项(较详细)
- 华为手机的快应用是什么?如何使用快应用?
- linux温湿度传感器SHTC3驱动开发
- 博图v15编程手册_西门子博途TIA中文手册.pdf
热门文章
- echarts调节提示框背景颜色与透明度
- pycharm远程开发上传文件No files or folders found to process
- ceph集群运维记录
- Ubuntu: :nss_util.cc(655)] NSS_VersionCheck(3.26) failed. NSS = 3.26 is required. Please upgrad
- Linux实现JDK安装教程.(不会的小白也看得懂)
- Java知识体系整理(2021最新版)
- 行为型设计模式(八)命令模式【王者荣耀的服务端实现】
- AOE工程实践-银行卡OCR里的图像处理
- 关于微信中分享到朋友圈代码
- conda 安装yaml环境中的各种坑