我有上下文,可用于生成预测。根据上下文进行预测的算法不是我的问题的一部分。但是很费时间,所以我把它从主线程中移出来了。在任何时候上下文都可能改变。发生这种情况时,应用程序应使用新输入重新启动预测生成。与旧上下文相关的预测将变得无效,因此应中断其计算。
现在我使用代码:
public class BackgroundTasksManager {
public static final BackgroundTasksManager shared = new BackgroundTasksManager();
private ExecutorService conceptResultsExecutor = null;
private BackgroundTasksManager() { }
public void startConceptResultsCalculation(ConceptResultsCalculationInput input,
Consumer<ConceptResultsCalculationOutput> callback) {
ThreadGroup callbackGroup = Thread.currentThread().getThreadGroup();
if (conceptResultsExecutor != null)
conceptResultsExecutor.shutdownNow();
conceptResultsExecutor = Executors.newSingleThreadExecutor();
conceptResultsExecutor.submit(() -> {
ConceptResultsCalculationOutput output = ConceptResultsCombinator.possbileResults(input);
Thread callbackThread = new Thread(callbackGroup, () -> callback.accept(output));
callbackThread.start();
});
}
因此,当我需要开始预测计算时,我会关闭旧的 Executor 并创建新的 Executor。此解决方案有效,但它是否有效,或者隐藏了一些危险的细微差别?
最佳答案
要停止线程 - 您可以 interrupt
它,通过直接调用 Thread::interrupt
或者,在您的情况下,请调用 shutDownNow
,这将隐式调用它。或者你可以有一个 volatile boolean stop
标志,其他一些线程需要设置并且您的线程需要检查。
如果您的线程不响应中断,则 shutDownNow
除了阻止 future 的任务安排在它上面之外,不会做任何事情。
关于java - 立即停止线程的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66036459/