问题描述
方法F(),当我想让F最多执行一分钟,如果一分钟还没结束就继续往下走,运行后面的代码实际情况中F很快就可以结束,现在有的时候会出异常,导致F很久都执行不完,导致后面的流程延迟太大的
解决方案
解决方案二:
另启一个线程,执行F(),结束之后,notify原来的线程,同时再判断一下执行时间,如果超时的话就不要再做下去了。原来的线程wait(60000L)
解决方案三:
这要看F方法的代码自己是否能够控制,如果不能控制的话,则只能采用一楼的这种办法。如果F方法的代码自己可以控制的话,则可以另起一个线程,循环判断,如果时间一分钟到了,而F还没有执行完成的话,通知F不要执行了,继续执行后面的代码。
解决方案四:
1楼的方法可实现,也可用CountDownLatch,一样的。另外若工作线程会占用大量资源或者可能死循环,可用Thread.interrupt方法中断它
解决方案五:
实际情况中F很快就可以结束,现在有的时候会出异常。。。。。还是研究下为什么会变慢的好,看看那几行代码有问题,能不能避免根据情况可以在主线程启动一个新线程运行F()。或F()里面开一个新线程来运行耗时的操作。第二种方法更好,不过要知道F()的到底是如何实现的。随便举一个例子:有错误请指正importjava.util.logging.Level;importjava.util.logging.Logger;classMainThread{publicvoidgood(){//启动一个线程执行F()方法Workerw=newWorker("运行F()",this);w.start();//等等10秒synchronized(this){try{wait(10000);}catch(InterruptedExceptionex){Logger.getLogger(MainThread.class.getName()).log(Level.SEVERE,null,ex);}w.shutdown();}}publicvoidF()throwsInterruptedException{System.out.println("玩游戏");//做一些事情//如果会InterruptedException异常//Thread.sleep(1000000);}privateclassWorkerextendsThread{privatefinalMainThreadmt;publicWorker(Stringname,MainThreadmt){super("线程名字是"+name);this.mt=mt;}publicfinalvoidshutdown(){interrupt();}@Overridepublicfinalvoidrun(){try{mt.F();}catch(InterruptedExceptionex){//Logger.getLogger(Worker.class.getName()).log(Level.SEVERE,null,ex);}finally{//唤醒主线程。synchronized(mt){mt.notify();}}}}publicstaticvoidmain(String[]args){MainThreadmt=newMainThread();mt.good();}}
解决方案六:
这样也并不一定在一分钟内结束,如果非得一分钟内结束,调用Thread.stop(),但这个不安全
解决方案七:
用线程,休眠啊,sleep
解决方案八:
用休眠不能彻底解决问题,这样的话虽然暂时的休眠了线程,但实质上这个线程并没有结束.
解决方案九:
那就找到很久执行不完的问题所在啊,别人都是把复杂问题简单化,lz你打算把简单问题复杂化。java里最容易导致莫名其妙异常的就是多线程了,稳定性最难判断的也是多线程。
解决方案十:
用newDate获取当前系统时间判断不可以吗?