`

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

 
阅读更多

   先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操作则会立刻抛出异常。这种解决方式依赖于任务线程本身的实现,的确也不是什么高明的方式。

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

 

  

   

分享到:
评论

相关推荐

    java通过线程控制程序执行超时

    java通过线程控制程序执行超时,多线程,反射

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    BlockingQueue队列自定义超时时间取消线程池任务

    定义全局线程池,将用户的请求放入自定义队列中,排队等候线程调用,等待超时则自动取消该任务,实现超时可取消的异步任务

    java线程池源码-cThreadPool:JAVA线程池源码分析与重写

    java线程池源码 cThreadPool 项目描述:对java.util.concurrent包下线程池相关源码进行重新实现,深入研究和学习线程池超时机制、饱和策略、生命周期等知识 ThreadPoolExecutor类下部分方法和内部类介绍: 1、Worker...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    米哈游笔试题目-Java方向.docx

    使用信号量实现资源访问控制:需要设计一个多线程程序,使用信号量实现对资源的多线程访问控制,能够限制同时访问资源的线程数量。 分布式锁类:需要设计一个分布式锁类,能够通过网络实现多个进程或多个服务器之间...

    isolation-threadpool:从Hystrix核心代码中提取出来的线程池隔离的代码,可以非常方便的在Web应用中实现线程池隔离

    大多数线程阻塞等待数据响应返回,新的请求无法建立SSL连接,导致整个Jetty线程池都被该服务占用,最终拖垮了整个Jetty,因此我们有必要能把不同HTTP服务隔离到不同的线程池中,即使其中某个HTTP服务的线程池满了也...

    使用Java异步编程实现一个简单的网络请求.txt

    首先,我们定义了一个URL地址和一个超时时间(TIMEOUT),然后使用ExecutorService创建了一个线程池,该线程池包含两个线程。接下来,我们通过调用executor.submit()方法提交了两个任务,分别对应GET和POST两种HTTP...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】Java四种线程池的创建方法 83 【多线程】线程池原理和运行机制 83 【多线程】线程池对任务的处理 85 【多线程】线程池的状态 86 线程池的状态说明 86 各个状态之间的转换 86 【多线程】什么是线程池?如果...

    java微信公众号MVC开发框架

    微信方法是由Servlet在获取请求消息或事件的策略后取得,Servlet取得微信方法后,在线程池中获取线程执行微信方法。缺省线程池的大小是10个,如果微信公众并发比较频繁,我们可以调整线程池的大小,以提高处理效率。...

    easyExcel实现大数据导出

    阿里巴巴easyExcel实现大数据导出!!

    cachedThreadPoolExample:该项目是通过使用缓存线程池进行并行处理的示例

    缓存线程池示例 该项目是通过使用缓存线程池进行并行处理的示例。 假设我们将关键字列表传递给 Web 服务,该服务... 同样,如果线程失败(返回 null 或超时),我们会减少允许的线程数量,以确保整体性能不会受到影响。

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...

    Java CP/IP Socket编程

    4.1.1 Java 多线程..........78 4.1.2 服务器协议..........80 4.1.3 一客户一线程..........84 4.1.4 线程池..........86 4.1.5 系统管理调度:Executor接口..........89 4.2 阻塞和超时..........91 4.2.1 ...

    java8集合源码分析-noah-bestPractices:Java业务最佳实践与踩坑

    使用了并发工具类库,线程安全就高枕无忧了吗?: 02 代码加锁:不要让“锁”事成为烦心事: 03 线程池:业务代码最常用也最容易犯错的组件: 04 连接池:别让连接池帮了倒忙: 05 HTTP调用:你考虑到超时、重试、...

    java并发编程

    主要介绍java常用并发API,内容有: 基于String构建自己的锁管理器、 Collections构建不可修改的集合对象、 CopyOnWriteArrayList的应用场景、 可堵塞队列的功能及行为、 使用API实现压力测试、 CyclicBarrier与...

Global site tag (gtag.js) - Google Analytics