java线程池中的线程超时控制

2023-05-16

   先MARK下一篇将JDK自带线程池的工具文,讲得挺清楚。

  http://www.oschina.net/question/565065_86540

   一些系统中的外部IO调用,比如调用第三方系统的WEBSERVICE等,尽管可以设定超时时间,但若每次调用都接近超时的上限的话,在并发较大的情况下很容易会造成系统不堪重负。此时若此调用无需实时获得调用结果,则可采用newFixedThreadPool将并发调用数限制在一定数量下,其他任务自动进入内存队列。

    而开放给第三方系统的接口,在被调用时若处理较耗时,则可采用先放入线程池并立即返回的异步处理方式提高系统吞吐量。

    同时,JAVA线程池也可以同时配合可持久化的任务队列来来防止任务的丢失。

 

     最近,项目又提出,在某些场景下,还要加入线程超时机制。

     于是百度之,发现被转载最多的整体思路就是: 每启动一个线程的时候,通过join(long timeout)方法或者其他类似方法(比如java.util.concurrent.Future.get(long timeout, TimeUnit unit) )启动一个监听线程,当监听线程通过上述方法判断任务线程超时,再调用interrupt或者cancel方法退出线程。

 

      上述解决方案仔细看了下,有如下2个问题:

       1.这种方式,每执行一个任务要启动2个线程,代价未免也太大了

     个人解决方式:

          对于每种类型的线程池,完全可以采用上文中的JDK自带线程池的实现,在提交任务的时候通过如下方法获得一个Future参数。

         <T> Future<T> java.util.concurrent.ExecutorService.submit(Callable<T> task)

           而对于每一个task,实现一个可获取任务启动时间的接口。       

           将该Future对象和提交的task对象放置于一个集合对象中,并启动一个独立线程,每隔一段时间(比如1秒)遍历该集合读写,并调用 boolean java.util.concurrent.Future.isDone()方法判断是否执行完成,若未完成,则比较task的启动时间和当前时间,若超时了,则启动关闭线程的操作。

        2.如何关闭一个线程

            这是前文百度到的解决方案中最误导人的地方。

           首先JAVA目前的中断模型是协作式的,调用interrupt()或者cancel()方法,只会在执行线程中设置一个中断标志位。是否真正要中断,则要看具体程序的逻辑。

           默认可中断的JAVA操作,主要集中于那些会让线程阻塞的操作。比如sleep(),wait()等。有个简单的判别办法,就是方法声明中是否有抛出中断异常,比如Thread.sleep(long millis) throws InterruptedException

而诸如IO操作或者同步时锁获取等阻塞,则不可被中断(当然,java nio或者JDK1.5的显式的Lock方式有提供了支持中断的方法)。

           前文百度到的范例代码,都是通过sleep()作为DEMO,这就是为什么很多人抱怨实际不起作用的原   因。

           那解决方式呢? 几乎没有。强制不由分说的关闭一个线程可能会导致各种问题,比如锁不释放等。一个比较偏门的方式就是让任务代码自己实现一个关闭资源的方法,超时时由监听线程调用。比如强制close掉socket,则正在调用中的IO操作则会立刻抛出异常。这种解决方式依赖于任务线程本身的实现,的确也不是什么高明的方式。

            在此求助下,如果各位有更好的关闭线程的方式,请不吝赐教!

 

  

   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java线程池中的线程超时控制 的相关文章

  • Hadoop-1.2 单机部署

    准备相关资源环境 运行环境工具 Linux Centos 6 3 JDK 1 7 0 51 SSH Secure Shell 1 下载Hadoop1 2 http mirrors cnnic cn apache hadoop common
  • Hbase-0.94.19 单机部署

    准备相关环境 运行环境工具 Linux Centos 6 3 JDK 1 7 0 60 Hadoop 1 2 1 SSH Secure Shell Hbase需建立在Hadoop环境之上运行 xff0c 参考Hadoop1 2 1单机部署
  • Android Beam:引领未来的NFC数据交换

    还记得吗 xff1f 惠普曾经将TouchPad平板电脑与Pre 3接触就实现了网页交换 也许那时大家都在想 xff1a 太酷啦 xff0c 要是我有TouchPad和pre3就好了 昨天新发布的Android 4 0Ice Cream S
  • TabHost设置选项卡被选中时背景颜色

    TabHost设置选项卡被选中时背景颜色 xff0c 通过给每个选项卡的Button设置背景样式实现 文件名 xff1a bottom btn first bg billboard xml 内容如下 xff1a lt xml version
  • 如何从文件中检索关键字出现的次数

    首先得到文件的完整路径 然后从流中读取每个字符 如果读出的字符和关键字的第一个字符相同 xff0c 则按照关键字长度读取相同个数的字符 分别判断是否相同 xff0c 若有一个不相同则break 否则计数器count 43 43 xff0c
  • 被其他Activity覆盖不触发onStop的情况

    被其他Activity覆盖不触发onStop的情况 xff1a 一般情况下当一个Activity被其他Activity覆盖时 被覆盖的Activity都会调用onStop xff08 xff09 方法 但是有两种情况除外 一个是上层Acti
  • 如何找到一个数组中第三大数字并输出它所在的位置

    面试题 如何找到一个数组中第三大数字并输出它所在的位置 延伸问题 xff1a 如何找到一个数组中第N大元素并输出它所在的位置 br public class FindThirdLarge br public static void getT
  • 输出出一个数组中出现次数最多的数字以及它出现的次数

    查找一个数组中出现次数最多的数字以及它出现的次数并输出出来 br public class FindMostAppearTime br public static void getMostAppearNumber int array br
  • Activity的四种启动模式

    color 61 red Standard color 默认启动模式 标准模式 每次启动Activity都会创建新的Activity对象实例 color 61 red SingleInstance color 只要在当前应用中启动过该Act
  • 可装载内核模块-Loadable Kernel Module (LKM)

    0x01 可装载模块分类 设备驱动 文件系统 系统调用 0x02 版本检查 Linux 的迅速发展致使相邻版本的内核之间亦存在较大的差异 xff0c 即在版本补丁号 xff08 Patch Level xff0c 即内核版本号的第四位数 x
  • couldn't load font "宋体 9", falling back to "Sans 9", expect ugly output.

    Windows下使用Ruby GNOME2写GUI时 xff0c 会报以下错误 xff1a Pango WARNING couldn 39 t load font 34 宋体 9 34 falling back to 34 Sans 9 3
  • TCP/IP数据包结构详解

    关键词 TCP IP 数据包 结构 详解 网络 协议 一般来说 xff0c 网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作 xff0c 但是一些特殊的情况下 xff0c 就需要深入的理解 网络数据包的结构 xff0c 以
  • Ubuntu 网络配制方法(同事的blog,拿来备份.)

    etc network interfaces 打开后里面可设置DHCP或手动设置静态ip 前面auto eth0 xff0c 让网卡开机自动挂载 1 以DHCP方式配置网卡 编辑文件 etc network interfaces sudo
  • 内存池:简单的内存池的实现

    转载自 xff1a http blog sina com cn s blog 46ed82810100ch8h html 当频繁地用malloc申请内存 xff0c 然后再用free释放内存时 xff0c 会存在两个主要问题 第一个问题是频
  • 浅谈如何学习linux

    一 为什么要学linux 当然最重要是爱好和兴趣 xff01 如果你这种必要学 xff0c 或者根本不喜欢 xff0c 请不要浪费时间 xff0c 你学也学不好 xff01 二 起步 你应该为自己创造一个学习linux的环境 在电脑上装一个
  • 用PV操作 实现生产者-消费者问题(C++语言)

    作者 xff1a wwj 时间 xff1a 2012 4 12 功能 xff1a 实现生产者和消费者正常活动 题目内容 xff1a 生产者 消费者问题 xff0c 是指两组进程共享一个环形的缓冲区 一组进程被称为生产者 xff0c 另一组进
  • Java异常处理总结

    找到一个关于异常总结的很详细的文章 分享下 异常在我们编程中很重 xff0c 在适当的位置 xff0c 合理的处理或者抛出异常 xff0c 对程序来说至关重要 转 xff1a 异常处理是程序设计中一个非常重要的方面 xff0c 也是程序设计
  • HashMap,LinkedHashMap,TreeMap应用

    HashMap LinkedHashMap TreeMap应用简介 共同点 xff1a HashMap LinkedHashMap TreeMap都属于Map xff1b Map 主要用于存储键 key 值 value 对 xff0c 根据
  • 关于Java加密扩展的出口限制

    近日 xff0c 在Matrix Security版上 http www matrix org cn thread shtml topicId 61 39543 amp forumId 61 55 提出一个问题 xff0c 即他的程序不能正
  • win7 设置共享无线网络

    适用范围 xff1a 1 WIN7平台电脑 2 笔记本或带有WIFI模块的台式电脑 3 搜索不到win7新建的临时网络的M9 生成wifi网络属性 xff1a 1 WLAN是802 11g标准 2 带宽为54Mbps 开启windows 7

随机推荐

  • Installing newer GCC versions in Ubuntu

    Installing newer GCC versions in Ubuntu It is often useful to have installed never versions of the compiler in our syste
  • VirtualBox网络配置

    VirtualBox提供了三种联网方式 xff0c 在这里介绍前两种方式 xff08 NAT和HostInterface xff09 的配置方法 xff0c 第三种联网方式属于利用主机上的所有的虚拟机构建一个虚拟网络的方法 xff0c 较简
  • SSL/TLS安全:Schannel中WinShock漏洞及解决办法

    Schannel 是最新被发现存在 SSL TLS 安全问题的加密库 xff0c 在过去一年中 SSL TLS 协议出于各种错误的塬因占据着新闻头条 苹果的 SecureTransport OpenSSL GnuTLS 和 Mozilla
  • tomcat 报错:Error occurred during initialization of VM

    Error occurred during initialization of VM Unable to load native library Can 39 t find dependent libraries 这个是由于java的lib
  • oracle的declare声明语法

    declare cc integer begin pkg elevator ref sp elevator ref add i id 61 gt 351 i code 61 gt 39 Testregist 39 i asset 61 gt
  • 输入用户名和密码登入到服务器,却显示指定的网络密码不正确,输入了好几次都是这样,这是怎么回事? 用户名和密码没问题 ,一直用的好好地今天就不行了...

    指定的网络密码不正确 修改一下组策略就可以了 运行 组策略编辑器 gpedit msc 打开计算机配置 windows设置 安全设置 本地策略 安全选项中的 xff1a 网络安全 xff1a LAN管理器身份验证级别 xff0c 默认是 没
  • git创建仓库,并提交代码(第一次创建并提交)

    一直想学GIT xff0c 一直不曾学会 主要是GUI界面的很少 xff0c 命令行大多记不住 今天尝试提交代码 xff0c 按GIT上给的方法 xff0c 没料到既然提交成功了 于是把它记下来 xff0c 方便以后学习 代码是学习用的 x
  • 贪吃蛇 AI 的实现 snake AI

    1 首先看下这个非常在微博上很火的贪吃蛇gif 这次我们尝试用代码来模拟下 xff0c 说不定上面这个图就是计算机搞的 2 讲贪吃蛇AI之前 xff0c 我们先看下贪吃蛇移动的特点 物理上给人的感觉是整个贪吃蛇往右移了一步 xff0c 在贪
  • CDF 累积分布函数(cumulative distribution function)

    论文中经常出现CDF曲线 xff0c 什么是CDF呢 xff1f 其实很简单 累积分布函数 xff08 cumulative distribution function xff09 定义 xff1a 对 连续函数 xff0c 所有小于等于a
  • Unity3D游戏开发之仿仙剑奇侠传一2D游戏 (一)

    今天要和大家分享的是基于Unity3D开发2D游戏 xff0c 博主一直钟爱于国产武侠RPG xff0c 这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了 xff0c 所以我们今天要做的就是利用Unity3D来实现在2D游戏中
  • Java中获取文件大小的正确方法

    本文出处 xff1a http blog csdn net chaijunkun article details 22387305 xff0c 转载请注明 由于本人不定期会整理相关博文 xff0c 会对相应内容作出完善 因此强烈建议在原始出
  • ubuntu 20.04安装gcc 4.9

    cd etc apt or sudo vim etc apt sources list 增加软件源 xff1a deb http dk archive ubuntu com ubuntu xenial main deb http dk ar
  • Linux下iptables屏蔽IP和端口号

    封单个IP的命令 xff1a iptables I INPUT s 124 115 0 199 j DROP 封IP段的命令 xff1a iptables I INPUT s 124 115 0 0 16 j DROP 封整个段的命令 xf
  • Linux 下zip包的压缩与解压

    linux zip 命令详解 功能说明 xff1a 压缩文件 语 法 xff1a zip AcdDfFghjJKlLmoqrSTuvVwXyz b lt 工作目录 gt ll n lt 字尾字符串 gt t lt 日期时间 gt lt 压缩
  • Oracle 函数 Translate 的用法

    一 语法 xff1a TRANSLATE string from str to str 二 目的 返回将 xff08 所有出现的 xff09 from str中的每个字符替换为to str中的相应字符以后的string TRANSLATE
  • java ant 详解

    1 什么是ant ant是构建工具 2 什么是构建 概念到处可查到 xff0c 形象来说 xff0c 你要把代码从某个地方拿来 xff0c 编译 xff0c 再拷贝到某个地方去等等操作 xff0c 当然不仅与此 xff0c 但是主要用来干这
  • kindeditor无法正常加载

    今天在给系统某jsp页面添加 kindeditor编辑器时 死活不正常显示 就只显示一个表格高度 可以左右拉伸就是拉不开 在下载下来的文件的example里都可以正常打开 判断原因 应该在我现有的项目里 xff0c 可能是js有冲突之类的
  • HTTP代理与反向代理

    quote size 61 medium 出于安全考虑 xff0c 局域网内的机器访问访问墙外的网站借助于代理服务器进行 xff0c 如果把局域网外Internet想象成一个巨大的资源库 xff0c 局域网内的用户要访问这个库里的资源必须统
  • java_HttpClient使用HttpGet进行json数据传输

    via http zhcheng iteye com blog 1292350 项目中与对方进行数据交互时 xff0c 对方提供了一套夸域json方式传递数据 xff0c 并给出了一个js示例 getJSON 34 http www asp
  • java线程池中的线程超时控制

    先MARK下一篇将JDK自带线程池的工具文 xff0c 讲得挺清楚 http www oschina net question 565065 86540 一些系统中的外部IO调用 xff0c 比如调用第三方系统的WEBSERVICE等 xf