社区
Java EE
帖子详情
java 超时控制的问题
xuhesheng
2012-09-25 02:31:31
网上搜了一些关于超时控制的问题
大多是使用守护线程作为计时器,
然后在计时器的start和cancel方法中写超时代码
可是系统给出超时Exception确实该守护线程的报错
不能在主线程中收到这种报错信息
这个就不能够起到超时控制的作用了
请问大家还有其他的方案能够控制住超时代码不?
或者思路想法什么的
大家交流下
...全文
2370
31
打赏
收藏
java 超时控制的问题
网上搜了一些关于超时控制的问题 大多是使用守护线程作为计时器, 然后在计时器的start和cancel方法中写超时代码 可是系统给出超时Exception确实该守护线程的报错 不能在主线程中收到这种报错信息 这个就不能够起到超时控制的作用了 请问大家还有其他的方案能够控制住超时代码不? 或者思路想法什么的 大家交流下
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
31 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dracularking
2012-10-31
打赏
举报
回复
通过线程来控制超时好还是不通过线程来控制超时好暂且不说
如果觉得通过线程控制超时不好,换成非线程,貌似没啥大差别
我只是对某种现象表达看法,纯讨论而已,倒没在意题不题
xuhesheng
2012-10-31
打赏
举报
回复
[Quote=引用 29 楼 的回复:]
你想说的是 在线程A的run方法中无法访问到线程B的实例?
[/Quote]
可以啊,可是你没发现自己跑题了么,你在线程A中访问的是线程,
而我需要的是监控并且在超时的时候中断
如果你一定要把我需要执行的代码放到线程里
那么我的代码要重新去写了
并且要做接口
同时,你有没有想过如果使用回调函数
会给我的代码带来多少的额外负担?
所以这种方法并不在采纳之内
因为改动量太多,这是大忌
dracularking
2012-10-31
打赏
举报
回复
[Quote=引用 28 楼 的回复:]
首先你在一个线程A中执行另外的线程B的cancel的时候,这个线程必须要是你在线程A中启动的才有效果的
这一点,我想大家都应该知道的
[/Quote]
你想说的是 在线程A的run方法中无法访问到线程B的实例?
xuhesheng
2012-10-31
打赏
举报
回复
[Quote=引用 27 楼 的回复:]
引用 26 楼 的回复:
引用 25 楼 的回复:
我指的是广义的线程工作类
java.util.concurrent.Future.cancel(boolean)
jav……
Timer,TimerTask的cancel方法也是只中断自己的
线程类都是这样设计的吧
前两个不怎么用到过,不是很清楚
是中断自己,在比如TimerTaskA中就不能调用TimerTa……
[/Quote]
同学,你跑题了
首先你在一个线程A中执行另外的线程B的cancel的时候,这个线程必须要是你在线程A中启动的才有效果的
这一点,我想大家都应该知道的
另外
如果我有给定的方法要求控制其超时功能
目前我的知识范围内是无解的
在我系统或者应用程序已经写成的情况下,用其他的线程只能起到监控的作用,而无法做到"从中作梗"的目的了
dracularking
2012-10-31
打赏
举报
回复
[Quote=引用 26 楼 的回复:]
引用 25 楼 的回复:
我指的是广义的线程工作类
java.util.concurrent.Future.cancel(boolean)
jav……
Timer,TimerTask的cancel方法也是只中断自己的
线程类都是这样设计的吧
前两个不怎么用到过,不是很清楚
[/Quote]
是中断自己,在比如TimerTaskA中就不能调用TimerTaskB的cancel方法了?
xuhesheng
2012-10-31
打赏
举报
回复
[Quote=引用 25 楼 的回复:]
我指的是广义的线程工作类
java.util.concurrent.Future.cancel(boolean)
jav……
[/Quote]
Timer,TimerTask的cancel方法也是只中断自己的
线程类都是这样设计的吧
前两个不怎么用到过,不是很清楚
dracularking
2012-10-30
打赏
举报
回复
[Quote=引用 21 楼 的回复:]
这个确实是,但是该方法是中断自身的操作,并不是中断其他线程的操作的
[/Quote]
其它线程就没有cancel方法了?
dracularking
2012-10-30
打赏
举报
回复
[Quote=引用 24 楼 的回复:]
引用 23 楼 的回复:
引用 21 楼 的回复:
这个确实是,但是该方法是中断自身的操作,并不是中断其他线程的操作的
其它线程就没有cancel方法了?
你可以自己写了...java本身带的那个就那些东西了.
[/Quote]
我指的是广义的线程工作类
java.util.concurrent.Future.cancel(boolean)
java.util.concurrent.FutureTask.cancel(boolean)
java.util.Timer.cancel()
java.util.TimerTask.cancel()
xuhesheng
2012-10-30
打赏
举报
回复
[Quote=引用 23 楼 的回复:]
引用 21 楼 的回复:
这个确实是,但是该方法是中断自身的操作,并不是中断其他线程的操作的
其它线程就没有cancel方法了?
[/Quote]
你可以自己写了...java本身带的那个就那些东西了.
xuhesheng
2012-10-29
打赏
举报
回复
[Quote=引用 20 楼 的回复:]
Socket的超时?
我是通过捕获SocketTimeoutException,然后置一个(其他线程的)标志位来实现的。
[/Quote]
哥们思路是正常大家的做法的.这个没错.但是可能您没能明白我的问题的意义,就是如果你不知道被中断的代码是什么,而可以在超时条件成立的时候中断这段需要被中断的代码.另外,socket,connection等超时的控制也是自己在方法内部完成并直接提供返回值或者抛出异常的.但是他并不能因为超时了而去阻止或者改变其他线程的过程.
xuhesheng
2012-10-29
打赏
举报
回复
[Quote=引用 17 楼 的回复:]
引用 14 楼 的回复:
这个我试过, 在线程里写一个 while(true) 绝对cancel()不了
既然Future,TimerTask等线程工作模块提供了cancel方法,它们总会有合适的工作环境来cancel的(否则cancel方法有何意义呢?),未必在while(true)下。
[/Quote]
这个确实是,但是该方法是中断自身的操作,并不是中断其他线程的操作的
想喝咖啡的貓
2012-10-29
打赏
举报
回复
Socket的超时?
我是通过捕获SocketTimeoutException,然后置一个(其他线程的)标志位来实现的。
xuhesheng
2012-10-29
打赏
举报
回复
[Quote=引用 16 楼 的回复:]
引用 13 楼 的回复:
这个问题个人觉得无解,因为是不可控的,比如你去做一个IO操作,
比如光驱去读一张非常烂的盘,读半天读不出来,但是你想结束,但是结束不了。因为很难马上结束IO操作。
我对目前具体实现也不是很了解,但从理论上来说,这类操作有什么理由始终结束不了呢(未必要马上结束)?
[/Quote]
那种操作是肯定会被结束的,因为这类操作本身是含有超时的控制的,但是如果不能够立即结束,那么我提出的讨论问题就没有意义了,谢谢你的回答.估计如果无解的话,我只能散分了
Kanepan
2012-10-25
打赏
举报
回复
[Quote=引用 17 楼 的回复:]
引用 14 楼 的回复:
这个我试过, 在线程里写一个 while(true) 绝对cancel()不了
既然Future,TimerTask等线程工作模块提供了cancel方法,它们总会有合适的工作环境来cancel的(否则cancel方法有何意义呢?),未必在while(true)下。
[/Quote]
wait sleep 可以中断的可以cancel, 其他则不可控的,这个Runnable去操作数据库查询了,而且这个查询时间很长, 或者加一个while(true) 之类的。
dracularking
2012-10-25
打赏
举报
回复
[Quote=引用 14 楼 的回复:]
这个我试过, 在线程里写一个 while(true) 绝对cancel()不了
[/Quote]
既然Future,TimerTask等线程工作模块提供了cancel方法,它们总会有合适的工作环境来cancel的(否则cancel方法有何意义呢?),未必在while(true)下。
dracularking
2012-10-25
打赏
举报
回复
[Quote=引用 13 楼 的回复:]
这个问题个人觉得无解,因为是不可控的,比如你去做一个IO操作,
比如光驱去读一张非常烂的盘,读半天读不出来,但是你想结束,但是结束不了。因为很难马上结束IO操作。
[/Quote]
我对目前具体实现也不是很了解,但从理论上来说,这类操作有什么理由始终结束不了呢(未必要马上结束)?
小菜的粉丝
2012-10-24
打赏
举报
回复
可以参考多线程设计模式之Future模式!
Kanepan
2012-10-24
打赏
举报
回复
[Quote=引用 12 楼 的回复:]
引用 11 楼 的回复:
引用 10 楼 的回复:
就是因为cancel()这个方法不安全
所以java已经禁止使用了
另外cancel()方法仅仅针对当前线程
另外,比如我需要执行长时间的方法之后还有其他的操作
那么我就不能阻止我当前的方法了
信号量的使用也不能够在我原有的代码基础上进行了
例如一段代码执行的时间太长了
我不可能让这段代码从什么地方中断的
……
[/Quote]
这个我试过, 在线程里写一个 while(true) 绝对cancel()不了
Kanepan
2012-10-24
打赏
举报
回复
这个问题个人觉得无解,因为是不可控的,比如你去做一个IO操作,
比如光驱去读一张非常烂的盘,读半天读不出来,但是你想结束,但是结束不了。因为很难马上结束IO操作。
dracularking
2012-10-24
打赏
举报
回复
[Quote=引用 11 楼 的回复:]
引用 10 楼 的回复:
就是因为cancel()这个方法不安全
所以java已经禁止使用了
另外cancel()方法仅仅针对当前线程
另外,比如我需要执行长时间的方法之后还有其他的操作
那么我就不能阻止我当前的方法了
信号量的使用也不能够在我原有的代码基础上进行了
例如一段代码执行的时间太长了
我不可能让这段代码从什么地方中断的
[/Quote]
那现在不说线程交互,是说线程的停止了
你说的是Thread类的stop() destroy()等方法被deprecated了吧
这是狭义的,并不能说明广义上的线程工作无法取消或停止
以下这些貌似都可以
java.util.concurrent.Future.cancel(boolean)
java.util.concurrent.FutureTask.cancel(boolean)
java.util.Timer.cancel()
java.util.TimerTask.cancel()
加载更多回复(11)
Java
核心技术 典型案例与面试实战系列二(Spring Boot)
故而,debug也趁此机会撸了一套新的实战课程:《
Java
核心技术-典型案例与面试实战系列二(基于Spring Boot2.0)》 顾名思义,这是debug为诸位规划的实战系列课程,其课程内容、学习收益、课程目录、技术栈等...
java
超时
控制
_
Java
超时
控制
的实现
基本原理采用LockSupport的...否则就等待
超时
返回(
超时
采用一线程轮询 + lock的condition的await 双重保险)实例import
java
.text.SimpleDateFormat;import
java
.util.Date;import
java
.util.Map;import
java
....
java
阻塞
超时
_
JAVA
防线程阻塞(
超时
控制
)
2.[代码]TimeoutThread/***
java
线程
超时
控制
的实现**
超时
控制
一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序
超时
后, 往往需要进行一些操作,比如退出线程,或者重新执行.* ...
java
实现
超时
_
Java
任务
超时
处理机制实现
1
问题
描述在应用软件的开发中,...根据执行任务的方法是否异步,可以把
问题
从两个方面分析:如果方法顺序执行,则方法执行时整个程序的
控制
权在执行任务的方法中,方法调用者对于任务的
超时
无能为力,只能寄希望于...
Java EE
67,513
社区成员
225,879
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章