比如说,我调用一个方法:int number = getNumber();当然一般情况下,getNumber();的处理时间不会很久。
现在假设getNumber();的处理时间在特殊情况下会长到30秒以上,
而在应用中,这种长时间的等待通常是无法容忍的。
现在的问题是: 如何处理,当getNumber();处理时间超过30的时候
跳出这条语句。其实getNumber();有点像连接数据库或网络超时一样。高手多多帮忙啊。比较有兴趣的和我直接联系
qq:154665267
e-mail:[email protected]

解决方案 »

  1.   

    执行getNumber()的时候可以启动一个Timer,用Timer计时来判断超时。
      

  2.   

    是 使用Timer.schedule(TimerTask task, long delay) ;当超过指定的时间就执行 task的run(),来达到处理吗?如果是这样,不能达到目的,task的run(),不会影响到getNumber()的执行。
    他们在不同的线程里面。今天弄了一天了,没想法。
      

  3.   

    问:
    当然一般情况下,getNumber();的处理时间不会很久。 
    现在假设getNumber();的处理时间在特殊情况下会长到30秒以上, 
    而在应用中,这种长时间的等待通常是无法容忍的。 
    现在的问题是: 如何处理,当getNumber();处理时间超过30的时候 
    跳出这条语句。 

    其实getNumber();有点像连接数据库或网络超时一样。 答:很简单.用join(30*1000);//最多等待30秒
    理由:
    1)将getNumber()包装成线程,这个线程称为:线程B.而调用并等待线程B的调用者线程不妨称为:线程A.
    线程A最多等待线程B执行getNumber()30秒,故:线程A使用语句:线程B对象.join(30*1000);表示线程A最多只能等待线程B30秒.时间一到,线程A将自己继续运行下去.
    2)这时,线程B怎么办?这时由于线程B已没有价值,线程B应该结束运行了.那线程B如何结束运行呢?在JAVA中,一个线程只有自己主动结束自己的运行,即线程A线程是不能强行结束线程B的运行的,而是发出一个信息(如:调用线程B.interrupt()方法,或设置一个boolean stopThreadB=true;)来请求线程B自己该结束了.这时线程B通过监视这些信号,来结束自己的run().
    3)强制线程结束的含义不是指调用:System.exit(0).来结束线程.以上仅供你参考
      

  4.   


    非常感谢 jiangnaisong。
    按照你的指点,基本实现了我需要的功能。剩余的问题是:现在我无法结束线程B的运行。
    根据原则:在JAVA中,一个线程只有自己主动结束自己的运行,即线程A线程是不能强行结束线程B的运行,
    处理方法:而是发出一个信息(如:调用线程B.interrupt()方法,或设置一个boolean stopThreadB=true;)。我的认识:
    调用线程B.interrupt(),只有在线程B sleep的情况下才能起作用,
    设置一个boolean stopThreadB=true; 我的线程B不是在循环处理,它可能在请求一个远程的服务,所以它不可能通过判断标志位来结束自己。继续等待指点!!
      

  5.   

    问:
    我的认识: 
    调用线程B.interrupt(),只有在线程B sleep的情况下才能起作用, 
    设置一个boolean stopThreadB=true; 我的线程B不是在循环处理,它可能在请求一个远程的服务,所以它不可能通过判断标志位来结束自己。 
    答:
    1)线程是自己主动结束自己运行的.这就是说,在安排线程B的代码时,尤其是设计:getNumber()中的程序代码时,将不得不安排一些检测boolean stopThreadB是不是为true的代码.若为true,从getNumber()中立即跳出整个run(),结束自己的运行.方法:可考虑用:throw语句抛出一个你自己定义的一个异常的办法来从getNumber()中(尤其是getNumber()已递归到很深的层次时)立即跳到run()中,然后立即结束run().
    2)调用线程B.interrupt()的目的,是立即唤醒线程B(有紧急事件处理,快醒.),在它的InterruptedException异常处理代码中立即检测:boolean stopThreadB是不是为true的代码.若为true,则处理方式同上.以上仅供你参考
      

  6.   


    我的情况是这样的: 工作需要,正构建一个小型的分布式搜索服务器,就是把不同的索引放在不同的服务器上。用rmi实现。当客户端有个请求
    getDocuments(String keyword)到达的时候,服务器进行处理并返回数据。为了考虑最坏的情况,比如服务器处理的时间太久,不想等待,我在服务器里写了死循环。(不知道这样的模拟合理吗?)
    因此我在客户端请求 getDocuments(String keyword)的时候,客户端就只能无限等待,并且getDocuments(String keyword)不可能再取处理其他事情,比如检测标志位,它就一直卡在那里。也无法抛出异常。因为它已经不会取执行下一条语句了。调用线程B.interrupt()的目的,是立即唤醒线程B(有紧急事件处理,快醒.), 如果线程B没有sleep的话,它不会抛出InterruptedException,当然也就不能在
    InterruptedException异常处理代码中处理其他事情了。  既然是唤醒,肯定是说本来是在睡才能唤醒的吧。是不是这样呢?
    继续等待指点!! 
      

  7.   


    我想可以用简单的程序来说明这个问题:public class Main3 { /**
     * @param args
     */
    public static void main(String[] args)
    {
                    //可以添加任何操作
    //必须保证getNumber();有执行。
    //如何处理当getNumber();执行超时时退出程序。
    getNumber(); } private static void getNumber()
    {
    //不允许修改此方法
    while(true){
    }
    }
    }
      

  8.   

    答:你的意思我总结一下,是不是这样:getNumber()方法是有可能在网络上一直在等待服务器响应的业务方法.其中的代码现在不允许修改.在此条件下,如何设计代码?
    在这种条件下,我想getNumber()所在的线程已没有较好的手段来结束它了(因为它一直处于网络等待状态,没有办法去执行监视结束条件的代码了).也只好先让它继续运行,到时自己结束了.反正它也不干扰主线程A的运行.
    所以,感觉上getNumber()中代码在设计时力求不要一直在等待.如:网络通信时可否设置超时措施等.以上仅供你参考
      

  9.   


    你的理解完全正确,在rmi中,如:Server server = Nameing.lookup(".......");//这样就相当于得到一个远程对象的引用getNumber()定义如:private int getNumber(){   Server server = Nameing.lookup(".......");
       return server.service();//考虑service(),处理不当,进去死循环的情况
    }到现在为止,我也觉得没有较好的手段来结束它,虽然不印象主线程的运行,但是它不结束,如果客户端连续请求,那么线程就越来越多,然后就一个结果,宕机...好像java rmi自己有超时的控制,好好去学学,理清了贴到这里来。