日期:2014-05-19  浏览次数:20749 次

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

请问大家还有其他的方案能够控制住超时代码不?
或者思路想法什么的
大家交流下

------解决方案--------------------
要看你想控制的是什么,比如是防止JDBC操作超时,那么可以在超时后调用cancel()命令。

如果是常规性的超时控制,则没有很好的方法,只能用状态变化来通知主线程,但是需要主线程去检查这个状态。
------解决方案--------------------
探讨

大家不要介个样子嘛
说散分的时候都出来冒泡了....



java不允许其他线程阻断当前线程
这样会存在不安全的地方

比如你走路走的好好的
别人在那突然跑过来把你打倒.....
你身上的钱财就下落不明了肯定....

------解决方案--------------------
探讨

引用:
引用:

这个问题无解么
如果无解,那我直接散分了...
还有人回答没

线程之间有交互的方式吧?
另外超时控制一定要用其它线程吗?


暂时没找到可以交互的

可以帮忙发动下你的朋友帮忙解决不

------解决方案--------------------
探讨

引用:

就是因为cancel()这个方法不安全
所以java已经禁止使用了
另外cancel()方法仅仅针对当前线程

另外,比如我需要执行长时间的方法之后还有其他的操作
那么我就不能阻止我当前的方法了
信号量的使用也不能够在我原有的代码基础上进行了
例如一段代码执行的时间太长了
我不可能让这段代码从什么地方中断的

------解决方案--------------------
这个问题个人觉得无解,因为是不可控的,比如你去做一个IO操作, 
比如光驱去读一张非常烂的盘,读半天读不出来,但是你想结束,但是结束不了。因为很难马上结束IO操作。
------解决方案--------------------
探讨
引用:
引用:
就是因为cancel()这个方法不安全
所以java已经禁止使用了
另外cancel()方法仅仅针对当前线程

另外,比如我需要执行长时间的方法之后还有其他的操作
那么我就不能阻止我当前的方法了
信号量的使用也不能够在我原有的代码基础上进行了
例如一段代码执行的时间太长了
我不可能让这段代码从什么地方中断的

……

------解决方案--------------------
可以参考多线程设计模式之Future模式!
------解决方案--------------------
探讨

这个问题个人觉得无解,因为是不可控的,比如你去做一个IO操作,
比如光驱去读一张非常烂的盘,读半天读不出来,但是你想结束,但是结束不了。因为很难马上结束IO操作。

------解决方案--------------------
探讨

这个我试过, 在线程里写一个 while(true) 绝对cancel()不了

------解决方案--------------------
探讨

引用:

这个我试过, 在线程里写一个 while(true) 绝对cancel()不了


既然Future,TimerTask等线程工作模块提供了cancel方法,它们总会有合适的工作环境来cancel的(否则cancel方法有何意义呢?),未必在while(true)下。

------解决方案--------------------
Socket的超时?

我是通过捕获SocketTimeoutException,然后置一个(其他线程的)标志位来实现的。