我的问题的一般情况是,我们如何检测特定函数调用是否花费太长时间才能终止它?
在我的脑海中,我想到使用一个线程来运行该函数,如果它运行的时间太长,则终止该线程,如下所述:
class MyThread extends Thread
{
public void run()
{
someFunction();
}
}
并说someFunction可能是:
public void someFunction()
{
// Unknown code that could take arbitrarily long time.
}
在上面的代码中,someFunction()
可能没有时间完成,或者需要永远,所以说我想在它花费太长时间时停止它。
但是,在Java线程实现中,显然我不能在线程中使用共享变量或任何时间戳,以便线程具有时间感,因为someFunction()
以原子方式运行并且这样检查-against-timestamp代码只能在someFunction
之后,因此变得无用,因为在执行编码时,someFunction已经完成。
请注意,我也想在someFunction()
不可知的情况下这样做。也就是说,someFunction()
不应该
担心它运行了多少时间。根本不应该意识到它。
任何人都可以提供一些有关如何实现此功能的见解吗?
答案 0 :(得分:3)
我会使用ExecutorService
来运行该线程。然后我会找回Future
并使用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);
}