java - 立即停止线程的最佳实践

标签 java multithreading

我有上下文,可用于生成预测。根据上下文进行预测的算法不是我的问题的一部分。但是很费时间,所以我把它从主线程中移出来了。在任何时候上下文都可能改变。发生这种情况时,应用程序应使用新输入重新启动预测生成。与旧上下文相关的预测将变得无效,因此应中断其计算。
现在我使用代码:

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/

相关文章:

java - 正则表达式 foo_bar_number 为 2 个字符串 [foo_bar, number]?

java - 在单独线程上刷新 Gui

c# - 从不同的线程访问对象

c# - Interlocked.Exchange 后无锁读取值?

java - Flutter/Dart - FlutterFirebaseMessagingPlugin.java - 构建失败,异常 "error: cannot find symbol"

java - Hadoop MapReduce - 按值求和和排序

java - RxJava 对象转换

java - 如何使用 JSTL 创建表?

multithreading - Rust-在多个worker之间共享结构中的哈希集的最佳方法

java - 意外的线程唤醒