我有上下文,可以用来产生预测结果。基于上下文制定预测算法不是我的问题的一部分。但它需要花费大量时间,所以我将其从主线程中移出。任何时候上下文都可能改变。当这种情况发生时,应用程序应重新启动具有新输入的预测生成。与旧上下文相关的预测将变得无效,因此必须中断其计算。
目前,我使用以下代码:
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并创建一个新的。这种解决方案可以工作,但它是否有效或者隐藏了一些危险的细节呢?