`
aerchi
  • 浏览: 425043 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
文章分类
社区版块
存档分类
最新评论

JAVA处理线程超时

 
阅读更多

在实际业务中,由其是多线程并开业务中,经常会遇到某个线程执行超时。而程序如果不捕获这类情况,就会导致程序一直处于等待状态,从而影响后续线程的运行。
比如说网络通迅、单任务下的复杂数据库查询等,通常处理这类问题,可以启用一个后台守护线程来监控用户线程(业务线程)的执行是否超时,如果超时就不在等待,这种做法,通常是在调用用户线程的.start()方法之前,调用守护线程的start()方法,同时将超时时长传给守护线程。在守护线程的run()方法,执行sleep()方法,休眠时间为超时时长,守护线程中有一个同步后的变量用于存储用户线程是否超时。而在用户线程中,在程序执行完之后,再调用守掮线程改变同步变量。当守护线程sleep()方法之后,去有判断同步变量的值是否已改变,如果没有改变,说明用户线程还未扫行完毕,也就是超时。但这种方法,不能中断用户线程。
除此之外,还有一种方法,可以中断用户线程不在继续运行,采用java.util.concurrent下面的接口、类也可以完成。以下是例子。

Java代码收藏代码
  1. importjava.util.concurrent.Callable;
  2. importjava.util.concurrent.ExecutionException;
  3. importjava.util.concurrent.ExecutorService;
  4. importjava.util.concurrent.Executors;
  5. importjava.util.concurrent.Future;
  6. importjava.util.concurrent.TimeUnit;
  7. importjava.util.concurrent.TimeoutException;
  8. publicclassTimeOut{
  9. publicstaticvoidmain(String[]args){
  10. inttimeout=2;//秒.
  11. ExecutorServiceexecutor=Executors.newSingleThreadExecutor();
  12. Booleanresult=false;
  13. Future<Boolean>future=executor.submit(newMyJob("请求参数"));//将任务提交到线程池中
  14. try{
  15. result=future.get(timeout*1000,TimeUnit.MILLISECONDS);//设定在200毫秒的时间内完成
  16. System.out.println(result);
  17. }catch(InterruptedExceptione){
  18. System.out.println("线程中断出错。");
  19. future.cancel(true);//中断执行此任务的线程
  20. }catch(ExecutionExceptione){
  21. System.out.println("线程服务出错。");
  22. future.cancel(true);//中断执行此任务的线程
  23. }catch(TimeoutExceptione){//超时异常
  24. System.out.println("超时。");
  25. future.cancel(true);//中断执行此任务的线程
  26. }finally{
  27. System.out.println("线程服务关闭。");
  28. executor.shutdown();
  29. }
  30. }
  31. staticclassMyJobimplementsCallable<Boolean>{
  32. privateStringt;
  33. publicMyJob(Stringtemp){
  34. this.t=temp;
  35. }
  36. publicBooleancall(){
  37. for(inti=0;i<999999999;i++){
  38. if(i==999999997){
  39. System.out.println(t);
  40. }
  41. if(Thread.interrupted()){//很重要
  42. returnfalse;
  43. }
  44. }
  45. System.out.println("继续执行..........");
  46. returntrue;
  47. }
  48. }
  49. }

分享到:
评论

相关推荐

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

    java通过线程控制程序执行超时(新) 基本数据类型 反射 线程 超时

    Java线程超时监控

    讲解有关Java中多线程运行时针对单个线程的执行超时监控机制,用于处理单个线程执行控制

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

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

    线程超时死掉

    Future接口是Java线程Future模式的实 现,可以来进行异步计算。 Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便...

    Java中实现线程的超时中断方法实例

    之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下

    Java同步线程模型分析与改进

    该文针对Java同步线程模型的缺陷,扩展synchronisedA键字语法,使它支持多个参数和能接受一个超时说明

    java多线程URL方式下载单个大文件

    Java代码,根据URL方式下载单个文件或者图片,根据文件大小进行分批启动多线程下载!

    Java HttpURLConnection超时和IO异常处理

    主要介绍了Java HttpURLConnection超时和IO异常处理的相关资料,需要的朋友可以参考下

    浅谈java中异步多线程超时导致的服务异常

    下面小编就为大家带来一篇浅谈java中异步多线程超时导致的服务异常。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

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

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

    安卓,Android线程网络超时自动终止

    Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。 在下面的例子中使用了java 中的Timer类,对线程进行了约束,...

    Berkeley DB的java版本

    多线程支持 JE使用超时的方式来处理线程间的死琐问题 Database都采用简单的key value对应的形式 事务支持 允许创建二级库 这样我们就可以方便的使用一级key 二级key来访问我们的数据 支持RAM缓冲 这样就能减少...

    Java中停止线程执行的方法

    尽管可以在等待wait()条件那里放一个超时设置,但等待wait()的设计目的不是这样的,等待wait()在设计上是用于Java线程间的通信。 而使用睡眠sleep()方式,可以让线程从当前开始睡眠指定的时间。注意不要使用睡眠...

    Java同步线程模型分析与改进 (2010年)

    目前普遍采用急救包(BandIAjd)类库的方式解决Java线程模型存在的同步问题,但类库中的代码很难或无法实现优化。该文针对Java同步线程模型的缺陷,扩展synehronised关键字语法,使它支持多个参数和能接受一个超时...

    Berkeley DB Java Edition 4.1.10.zip

    多线程支持,JE使用超时的方式来处理线程间的死琐问题。 Database都采用简单的key/value对应的形式。 事务支持。 允许创建二级库。这样我们就可以方便的使用一级key,二级key来访问我们的数据。 支持RAM...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

Global site tag (gtag.js) - Google Analytics