问题

最近研究比特币, 从网络上下载区块的时候有时候碰到一个问题: 比特币的网络的请求和响应式是异步, 发送了一个请求无法判断这个请求有没有响应, 为了解决这个问题, 使用超时机制. 如果一起请求发起后, 一段时间没有接受到响应, 就切换到另外一个服务器重新请求, 于是就实现了一个工具类 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()唤醒.

  1. 构造函数指定 任务和超时时间
    public TimeoutTaskManager(Consumer<T> consumer, int time, TimeUnit unit) { ... }
  1. 添加服务的提供者
    public void addProvider(T provider) { ... }
  1. 移除提供者
    public synchronized void remove(T e) { ... }
  1. 如果是指定的任务是 几个任务的合集, 例如:集合中的任务耗时不同, 可以在完成一个任务后重置任务的超时时间, 所有的操作都必须是当前的提供者才可以修改, 因此有个参数 T me, 返回值判断是否修改成功
    public synchronized boolean touch(T me, long time, TimeUnit unit) { ... }

另外有个几个简单方法, 分别是默认超时时间的10倍和20倍: touchTenFold, touchTwentyFold

  1. 有一个断言方法认定当前是自己 assertIsMe, 如果不是自己会抛出 IllegalStateException 的异常
    public TimeoutTaskManager<T> assertIsMe(T me, String format, Object... args) throws IllegalStateException { ... }

一些其他方法有用的方法

  1. 可以添加一个提供者切换时候的监听器, 有时候切换的时候需要做一些清理工作
    public TimeoutTaskManager<T> addChangeListeners(BiConsumer<T, T> cn) { ... }
  1. 如果任务有共享数据可以放置到缓存中, 注意线程安全需要自己保证
    public TimeoutTaskManager<T> putCache(String key, Object cache) { ... }
  1. 还提供了线程的同步的方法, 不会在 doing 的过程中产生 provider 的切换, 注意:不要产生死锁
    public synchronized TimeoutTaskManager<T> ifMe(T me, Runnable doing) throws IllegalStateException { ... }

详细代码在 Gitee TimeoutTaskManager

(完)

java 可超时的任务管理相关推荐

  1. java 设置超时_java线程超时设置方法

    对于java中线程超时间可以使用ExecutorService与Timer来控制一个线程什么时候超时了,下面我整理了一些方法,这些文章都详细的介绍java线程超时设置技巧. 方法一 本例子使用Exec ...

  2. Java多线程超时判断

    Java多线程超时判断 应用场景 主要方法 实现代码 应用场景 多线程任务中,个别线程可能发生阻塞,无法正常返回,如果等待全部线程执行完毕,程序将无法正常执行结束.此时需要为多线程设置最大执行时间,超 ...

  3. java socket超时时间_java中socket 默认超时时间 | 学步园

    MS:永远吧 Java代码 connect publicvoidconnect(SocketAddress endpoint, inttimeout) throwsIOException Connec ...

  4. java订单超时取消设计_quartz框架和关闭超时订单

    Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运 ...

  5. java rmi 超时_java RMI服务超时

    Netty的worker线程只负责nio,在收到完整数据后将数据按要求封装并放入到业务数据队列:业务处理类负责从该队列中取出数据并处理. 这里的业务处理类现在是如何实现的?按你的说法,单线程和多线程 ...

  6. java阻塞超时_JAVA防线程阻塞(超时控制)

    2.[代码]TimeoutThread /** * java线程超时控制的实现 * * 超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要 ...

  7. java http超时重连_httpclient 重连机制

    我们在进行http请求时,难免会遇到请求失败的情况,失败后需要重新请求,尝试再次获取数据. Apache的HttpClient提供了异常重试机制,在该机制中,我们可以很灵活的定义在哪些异常情况下进行重 ...

  8. java事务超时时间,java – 如何在WebSphere Liberty Batch中配置事务超时?

    > javax.transaction.global.timeout的作用是什么? >我是否需要在CheckpointAlgorithm中实现checkpointTimeout()方法? ...

  9. poj java 输入超时_Java:如何实现代码超时功能?

    我们写一个有超时功能的 Callable: import java.util.concurrent.*; public class TimeoutCallable implements Callabl ...

最新文章

  1. C#中DateTime.Now.Ticks的用法和说明
  2. java 中lock,java中lock获取锁的四种方法
  3. python 帮助文档、自我解释
  4. 联想服务器DL388eu盘装系统,服务器价格指导 10月双路机架产品导购
  5. html5用圆圈画猫,html5的应用-画一个可爱的小猫咪效果图
  6. linux下使用nginx搭建集群,CentOS(linux) 下Nginx的安装(Nginx+Tomcat集群第一步)
  7. css垂直水平居中的整理
  8. lia人是什么意思_老话说“人穷别说话,位卑莫劝人”,什么意思?有何道理?...
  9. 新增一个主键自增长_使用技巧之——MyBatis如何返回插入主键
  10. linux退出python环境_Linux中的python虚拟环境
  11. Windows 10 TH2改进
  12. 如何成为优秀的技术人员
  13. ftp服务器登录没有文件,登录ftp服务器文件显示不出
  14. 『HarmonyOS』万物互联,分布式操作系统
  15. 学习自媒体究竟要投入多少?
  16. 永久关闭WPS热点,防止自启动
  17. 图论中的0x3f和memset使用注意事项(较详细)
  18. 华为手机的快应用是什么?如何使用快应用?
  19. linux温湿度传感器SHTC3驱动开发
  20. 博图v15编程手册_西门子博途TIA中文手册.pdf

热门文章

  1. echarts调节提示框背景颜色与透明度
  2. pycharm远程开发上传文件No files or folders found to process
  3. ceph集群运维记录
  4. Ubuntu: :nss_util.cc(655)] NSS_VersionCheck(3.26) failed. NSS = 3.26 is required. Please upgrad
  5. Linux实现JDK安装教程.(不会的小白也看得懂)
  6. Java知识体系整理(2021最新版)
  7. 行为型设计模式(八)命令模式【王者荣耀的服务端实现】
  8. AOE工程实践-银行卡OCR里的图像处理
  9. 关于微信中分享到朋友圈代码
  10. conda 安装yaml环境中的各种坑