如何限制线程的执行时间并在运行时间过长时终止它?

One*_*ero 3 java concurrency multithreading terminate

我的问题的一般情况是,我们如何检测特定函数调用是否花费了太长时间以至于我们想要终止它?

在我的脑海中,我想到使用一个线程来运行该函数,并在运行时间太长时终止该线程,如下定义:

class MyThread extends Thread
{
  public void run()
  {
    someFunction();
  }
}
Run Code Online (Sandbox Code Playgroud)

并说 someFunction 可能是:

public void someFunction()
{
  // Unknown code that could take arbitrarily long time. 
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,someFunction()可能不需要时间就能完成,或者需要永远,所以假设我想在花费太长时间时停止它。

然而,在Java线程实现中,显然我不能在线程中使用共享变量或任何时间戳,以便线程具有时间感,因为someFunction()原子地玩和这样的检查时间戳代码只能在之后someFunction,因此变得毫无用处,因为在执行编码时, someFunction 已经完成了。

请注意,我也想以不可知论的方式这样做someFunction()。也就是说,someFunction()不应该担心它运行了多少时间。它根本不应该意识到这一点。

任何人都可以提供一些有关我如何实现此功能的见解吗?

use*_*521 5

我会使用 anExecutorService来运行线程。然后我会返回 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);
}
Run Code Online (Sandbox Code Playgroud)