网上搜了一些关于超时控制的问题
大多是使用守护线程作为计时器,
然后在计时器的start和cancel方法中写超时代码
可是系统给出超时Exception确实该守护线程的报错
不能在主线程中收到这种报错信息
这个就不能够起到超时控制的作用了请问大家还有其他的方案能够控制住超时代码不?
或者思路想法什么的
大家交流下

解决方案 »

  1.   

    要看你想控制的是什么,比如是防止JDBC操作超时,那么可以在超时后调用cancel()命令。如果是常规性的超时控制,则没有很好的方法,只能用状态变化来通知主线程,但是需要主线程去检查这个状态。
      

  2.   

    每个线程都有个公用变量,
    while(变量true){...}
    守护线程发现某线程超时了就更改他的变量为false,让子线程停止。
      

  3.   

    大家不要介个样子嘛
    说散分的时候都出来冒泡了....java不允许其他线程阻断当前线程
    这样会存在不安全的地方比如你走路走的好好的
    别人在那突然跑过来把你打倒.....
    你身上的钱财就下落不明了肯定....
      

  4.   

    就是因为cancel()这个方法不安全
    所以java已经禁止使用了
    另外cancel()方法仅仅针对当前线程另外,比如我需要执行长时间的方法之后还有其他的操作
    那么我就不能阻止我当前的方法了
    信号量的使用也不能够在我原有的代码基础上进行了
    例如一段代码执行的时间太长了
    我不可能让这段代码从什么地方中断的
      

  5.   

    那现在不说线程交互,是说线程的停止了你说的是Thread类的stop() destroy()等方法被deprecated了吧
    这是狭义的,并不能说明广义上的线程工作无法取消或停止以下这些貌似都可以java.util.concurrent.Future.cancel(boolean) 
    java.util.concurrent.FutureTask.cancel(boolean) 
    java.util.Timer.cancel() 
    java.util.TimerTask.cancel() 
      

  6.   

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

  7.   


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

  8.   

    可以参考多线程设计模式之Future模式!
      

  9.   


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

  10.   


    wait sleep 可以中断的可以cancel, 其他则不可控的,这个Runnable去操作数据库查询了,而且这个查询时间很长, 或者加一个while(true) 之类的。
      

  11.   

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

  12.   

    哥们思路是正常大家的做法的.这个没错.但是可能您没能明白我的问题的意义,就是如果你不知道被中断的代码是什么,而可以在超时条件成立的时候中断这段需要被中断的代码.另外,socket,connection等超时的控制也是自己在方法内部完成并直接提供返回值或者抛出异常的.但是他并不能因为超时了而去阻止或者改变其他线程的过程.
      

  13.   

    其它线程就没有cancel方法了?
      

  14.   

    你可以自己写了...java本身带的那个就那些东西了.
      

  15.   

    我指的是广义的线程工作类java.util.concurrent.Future.cancel(boolean) 
    java.util.concurrent.FutureTask.cancel(boolean) 
    java.util.Timer.cancel() 
    java.util.TimerTask.cancel()  
      

  16.   


    Timer,TimerTask的cancel方法也是只中断自己的 
    线程类都是这样设计的吧
    前两个不怎么用到过,不是很清楚
      

  17.   

    是中断自己,在比如TimerTaskA中就不能调用TimerTaskB的cancel方法了?
      

  18.   


    同学,你跑题了
    首先你在一个线程A中执行另外的线程B的cancel的时候,这个线程必须要是你在线程A中启动的才有效果的
    这一点,我想大家都应该知道的另外
    如果我有给定的方法要求控制其超时功能
    目前我的知识范围内是无解的
    在我系统或者应用程序已经写成的情况下,用其他的线程只能起到监控的作用,而无法做到"从中作梗"的目的了
      

  19.   


    你想说的是 在线程A的run方法中无法访问到线程B的实例?