我的问题的一个一般情况是,我们如何检测某个特定的函数调用是否花费了太长时间以至于我们想终止它?
我想到要使用一个线程来运行该函数,并在运行时间过长时终止该线程,如下所示:
class MyThread extends Thread
{
public void run()
{
someFunction();
}
}
并说someFunction可能是:
public void someFunction()
{
// Unknown code that could take arbitrarily long time.
}
在上面的代码中,someFunction()
可能没有时间完成,或者花了很长时间,所以说我想在花费太长时间时停止它。
但是,在Java线程实现中,显然我不能在线程中使用共享变量或任何时间戳,以便线程具有时间感,这是因为someFunction()
原子上的乐趣,并且此类check-timestamp代码只能在someFunction
,之后执行,由于在执行编码时已经完成了someFunction,因此变得无用。
请注意,我也想做到someFunction()
不可知。也就是说,someFunction()
不必担心它会运行多少时间。它根本根本不应该意识到这一点。
谁能提供一些有关如何实现此功能的见解?
我将使用ExecutorService
运行线程。然后,我将取回aFuture
并使用get()
超时来取消它。
ExecutorService es = Executors.newFixedThreadPool(1); // You only asked for 1 thread
Future<?> future = es.submit( new Mythread() );
try {
future.get(timeout, TimeUnit.SECONDS); // This waits timeout seconds; returns null
} catch(TimeoutException e) {
future.cancel(true);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句