java 超时控制的问题

xuhesheng 2012-09-25 02:31:31
网上搜了一些关于超时控制的问题
大多是使用守护线程作为计时器,
然后在计时器的start和cancel方法中写超时代码
可是系统给出超时Exception确实该守护线程的报错
不能在主线程中收到这种报错信息
这个就不能够起到超时控制的作用了

请问大家还有其他的方案能够控制住超时代码不?
或者思路想法什么的
大家交流下
...全文
2370 31 打赏 收藏 转发到动态 举报
写回复
用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)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧