假设我有一段由线程运行的代码:
public void logic()
{
//Step1
//Step2
//Step3
//Step4
...
...
//Stepn
}
在这种方法中,无法调用可中断的方法(如wait,sleep,join)。并且有些步骤需要花费很多时间才能执行。原因可能是阻塞操作,如(socket.read或读取文件的方法)。我想确保如果整个逻辑方法没有在M秒内执行那么线程应该被杀死。实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
一般来说,在没有正在运行的线程本身的合作的情况下停止线程是一个混乱的问题。要做的事。 (阅读为什么弃用Java的Thread.stop())。 Posix线程也没有线程杀死机制。
你可能想要的是一个"请求停止"州。线程周期性地轮询这个以查看它是否应该自行关闭。如果被告知关闭它知道如何清理自己。
答案 1 :(得分:1)
你说“在这种方法中没有任何地方可以调用可中断的方法(比如等待,睡眠,加入)”,但是中断不仅限于阻塞方法;如果你检查它,任何方法都可以响应中断。
在logic
方法的每一步之间加上这样的内容:
if (Thread.currentThread().interrupted()) {
throw new InterruptedException();
}
(您可能希望将其实际放入某个静态allowInterruption
方法,并在每个步骤后调用它。)
答案 2 :(得分:0)
我会使用timed join。在超时结束时,您只能interrupt您的线程执行逻辑,这可能会导致InterruptedException。当然,您应该遵守Java监视器规范,因此需要对逻辑线程中的interrupted状态进行一些检查。
如果你确实无法进行中断检查,那么你可能想要使用未来:
Runnable job = new MyRunnable();
ExecutorService executor = Executors.newSingleThreadExecutor();
final Future future = executor.submit(job);
try {
// Execute the job with a time limit
future.get(5000, TimeUnit.MILLISECONDS);
} catch (final TimeoutException e) {
// Operation timed out, so log it and attempt to cancel the thread
// Notice that the thread is not going to be killed!
future.cancel(true);
} finally {
executor.shutdownNow();
}
只需用您的逻辑线程替换Runnable作业。 代码来源:http://www.coderanch.com/t/234096/threads/java/executing-time-bounded-job