【发布时间】:2017-04-11 02:48:18
【问题描述】:
我的任务是实现一个后台线程来执行后端异步处理,但在某些情况下需要从外部停止该作业。
我通过将 Runnable 中的所有内容包装在 try catch 块中并捕获 InterruptionException 来实现它,如果被捕获,线程将简单地返回并退出。
Runnable task = () -> {
try {
while (true) {
// do stuff
// sleep for interval
Thread.sleep(this.checkInterval);
}
} catch (InterruptedException ex) {
// cleanup and exit
return; // exit thread
} catch (Exception ex) {
// cleanup and exit
return; // exit thread
}
};
我正在使用 ExecutorService SingleThreadExecutor 并提交如下作业。
this.job = executorService.submit(task);
然后我使用
停止线程boolean canceled = this.job.cancel(true);
它似乎工作正常,因为如果线程正在运行,取消会导致 InterruptionException。
这段代码安全吗,这意味着当调用取消时,它总是保证会杀死线程?
【问题讨论】:
-
我会更担心进程上下文会在线程处于中间状态时被终止。
标签: java multithreading