这里使用JDK5+的java.util.concurrent包下的API实现,采用这种方式是相对比较安全的。
实现效果:
启动一个子任务,然后等待子任务的计算结果同时设定一个超时时间,如果等待时间超出预设定的超时时间,则中断子任务。
代码实现:
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * 启动一个任务,然后等待任务的计算结果,如果等待时间超出预设定的超时时间,则中止任务。 * * @author Chen Feng */ public class TaskTimeoutDemo { public static void main(String[] args) { System.out.println("Start ..."); ExecutorService exec = Executors.newCachedThreadPool(); testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到15秒 testTask(exec, 5); // 只等待5秒,任务还没结束,所以将任务中止 exec.shutdown(); System.out.println("End!"); } public static void testTask(ExecutorService exec, int timeout) { MyTask task = new MyTask(); Future<Boolean> future = exec.submit(task); Boolean taskResult = null; String failReason = null; try { // 等待计算结果,最长等待timeout秒,timeout秒后中止任务 taskResult = future.get(timeout, TimeUnit.SECONDS); } catch (InterruptedException e) { failReason = "主线程在等待计算结果时被中断!"; } catch (ExecutionException e) { failReason = "主线程等待计算结果,但计算抛出异常!"; } catch (TimeoutException e) { failReason = "主线程等待计算结果超时,因此中断任务线程!"; exec.shutdownNow(); } System.out.println("\ntaskResult : " + taskResult); System.out.println("failReason : " + failReason); } } class MyTask implements Callable<Boolean> { @Override public Boolean call() throws Exception { // 总计耗时约10秒 for (int i = 0; i < 100L; i++) { Thread.sleep(100); // 睡眠0.1秒 System.out.print('-'); } return Boolean.TRUE; } }
运行结果:
Start ... ---------------------------------------------------------------------------------------------------- taskResult : true failReason : null --------------------------------------------- taskResult : null failReason : 主线程等待计算结果超时,因此中断任务线程! End!
相关推荐
讲解有关Java中多线程运行时针对单个线程的执行超时监控机制,用于处理单个线程执行控制
java通过线程控制程序执行超时(新) 基本数据类型 反射 线程 超时
java通过线程控制程序执行超时,多线程,反射
解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...
.net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...
之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下
java 访问网络 下载文件 爬虫 超时处理解决方案
定义全局线程池,将用户的请求放入自定义队列中,排队等候线程调用,等待超时则自动取消该任务,实现超时可取消的异步任务
java超时取消正则表达式匹配方法,代码超时处理,设置代码执行时间,超棒的工具类 lambda,Callable,ExecutorService,超过执行5秒退出
Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下...在下面的例子中使用了java 中的Timer类,对线程进行了约束,如果线程在一定时间内为响应则终止该线程。
Java代码,根据URL方式下载单个文件或者图片,根据文件大小进行分批启动多线程下载!
在什么情况下使用线程池?...减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 下面是一个线程池例子,经测试绝对可行:
java中处理http连接超时的方法.pdf
Java程序执行超时——Future接口介绍
.net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...
c# 带超时的线程管理 Thread.cs ,支持线程队列,自动启动判断是否结束线程,线程队列批量启动与执行超时控制 Threadx.cs
该文针对Java同步线程模型的缺陷,扩展synchronisedA键字语法,使它支持多个参数和能接受一个超时说明
ManualResetEvent是一个超时等待的线程锁,如果超时返回false,接收指令显示true,但是没法实现在超时后让他继续等待,这种需求我们可以用在以下场景: 控制线程超时方法 1.[主线程]:请求方发送请求,立即创建超时等待...
下面小编就为大家带来一篇浅谈java中异步多线程超时导致的服务异常。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了C#中的多线程超时处理实践方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下