private void someMethodDeepDown() {
while (.. long running task .. ) {
try {
... do lots of work ...
// or just let it propagate up!
} catch (InterruptedException e) {
// oh no! an interrupt!
Thread.currentThread().interrupt();
throw new StopTheThreadRuntimeException(...);
}
}
}
3条答案
按热度按时间x9ybnkn61#
使线程以特定的时间间隔执行(例如,10秒)
你可以
使用
ScheduledExecutorService
在指定的时间段内重复执行任务。这已经在Stack Overflow上广泛讨论过了。搜索以了解更多信息。
如果超过时间限制,则在某个时间取消(例如,5秒)。
你不能
Java没有提供强制停止线程执行的方法。
Java并发只允许协作取消。您可以通过“中断”来表示您要停止另一个线程。但是这个中断尝试仅仅设置一个标志,如果线程处于睡眠状态,则唤醒线程。必须对任务进行编码,以便定期查找中断标志。如果设置了flag,则必须对任务进行编码,然后👉结束其自身的执行。
这一点在Stack Overflow上也有广泛的介绍。搜索以了解更多信息。
b1payxdu2#
你的方向是对的你完全可以用ExecutorService做到这一点。您可以使用
awaitTermination()
并设置一个超时,检查isTerminated()
线程是否已经完成(在shutdown()
之后),并请求终止任何尚未终止的线程。https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
jq6vz3qz3#
首先阅读这篇文章:
如何在给定Future对象的情况下中断线程?
你需要确保的主要事情是,当线程被中断时,你的线程负责任地行动。
换句话说,你的代码的责任是为任何中断做好准备。我想说的是,无论何时你有一个长时间运行的任务,你都应该插入一些像这样的中断准备代码:
如果你的代码经常检查
Thread.interrupted
,并且正确处理了InterruptedExceptions(例如:它会停止线程循环),就像这样:这将使您的线程可中断。然后就是跟踪每个线程的问题了,当它超过分配的时间时,可以调用Thread.interrupt(),它就会死亡。
大警告
不幸的是,有许多库不能正确处理InterruptedException,只是抑制它,或者在长时间运行的任务中不检查Thread.interrupted()。
因此,除非您完全控制线程的代码,否则无法保证线程会很快死亡。