Java 如何限制线程';s执行时间,如果运行时间过长,则终止它?

Java 如何限制线程';s执行时间,如果运行时间过长,则终止它?,java,multithreading,concurrency,terminate,Java,Multithreading,Concurrency,Terminate,我的问题的一个一般情况是,我们如何检测某个特定函数调用是否花费了太长时间,以至于我们想要终止它 在我的脑海中,我想到了使用一个线程来运行该函数,如果它运行得太长,则杀死该线程,定义如下: class MyThread extends Thread { public void run() { someFunction(); } } 然后说某个函数可能是: public void someFunction() { // Unknown code that could tak

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

在我的脑海中,我想到了使用一个线程来运行该函数,如果它运行得太长,则杀死该线程,定义如下:

class MyThread extends Thread
{
  public void run()
  {
    someFunction();
  }
}
然后说某个函数可能是:

public void someFunction()
{
  // Unknown code that could take arbitrarily long time. 
}
在上面的代码中,
someFunction()
可能不需要时间完成,或者需要很长的时间,所以如果需要很长时间,就说我想停止它

然而,在Java线程实现中,显然我不能在线程中使用共享变量或任何时间戳,这样线程就会有时间感,因为
someFunction()
funs是原子的,这种对时间戳代码的检查只能在
someFunction
之后进行,这样就变得无用了,因为在执行编码时,某些函数已经完成了

注意,我还希望使用不可知论的
someFunction()
来实现这一点。也就是说,
someFunction()
不应该 担心它会运行多少时间。它根本不应该意识到这一点


有人能提供一些关于我如何实现此功能的见解吗

我将使用执行器服务运行线程。然后我将返回一个
未来
,并使用带有超时的
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);
}
Executors服务=Executors.newFixedThreadPool(1);//你只要求一个线程
Future=es.submit(new Mythread());
试一试{
future.get(timeout,TimeUnit.SECONDS);//这将等待超时秒数;返回null
}捕获(超时异常e){
future.cancel(true);
}

您是在谈论死锁吗?我不希望人们像上面那样编写代码。给我们一个确切的场景。@almasshaikh锁一点也不重要。我只是问,如果我想确保一个线程不会运行太长时间,或者我们会杀死它,我们应该怎么做?使用另一个在线程启动后运行的计划线程,在其中包含线程引用并在一小时后醒来,如果它仍然运行,则中断它(前提是您的线程对中断做出响应).那不是一个理智的思考问题的方法。您编写线程运行的代码,因此将其编码为终止自身。每当你发现自己必须从外部“进入”线程以使其完成它需要做的事情时,这是一个明显的迹象,表明你没有将它编码为你想让它做的事情。@DavidSchwartz你是对的,我正在考虑极端情况,例如自动代码分级器,你无法控制要分级的代码,或者任何严重依赖于我们编写的程序无法控制的东西的东西。这将阻止对未来的等待。取消(true)将是无用的,除非函数被编写为正确处理(而不仅仅是捕获)中断异常和一般中断。假设有2个线程。比如说,我希望每个线程单独使用的时间不要超过10秒。假设第一个线程需要10秒,第一个未来。get()将等待10秒。假设第二个线程此时仍在运行,第二个线程上的future.get()将再等待10秒,因此总共需要20秒。如何避免这种情况?