【发布时间】:2019-07-26 09:27:54
【问题描述】:
我有一个简单的弹簧控制器,它等待一些动作完成。假设它如下所示:
@GetMapping("/wait")
public void waitForFinish() throws InterruptedException {
while (!allJobsAreFinished()) {
Thread.sleep(5000);
}
}
现在,出于某种原因,我想在一个单独的请求中中断这个线程。为此,我将正在运行的线程保存到一个映射中,并在一个单独的方法中调用.interrupt():
private Map<String, Thread> runningThreads = new ConcurrentHashMap<>();
@GetMapping("/wait")
public void waitForFinish() throws InterruptedException {
Thread currentThread = Thread.currentThread();
runningThreads.put("testId", currentThread);
//...
runningThreads.remove("testId");
}
@GetMapping("/cancel")
public void cancel() {
runningThreads.get("testId").interrupt();
}
我的问题如下:中断 Spring 创建的线程是个好主意吗?如果我中断 Spring 线程会出现什么问题?或者最好创建ExecutorService,将我的任务提交给它,然后通过Future在那里打断它们?
【问题讨论】:
-
你想在 /wait 端点中完成什么?
-
@jordiburgos 没关系,例如这个。可以有不同的长期运行逻辑。
Wait是最简单的例子。 -
如果你有长时间运行的逻辑,如果它们是独立的,那么使用
CompletableFuture,如果你中断web容器线程客户端将得到500响应@DDovzhenko,不建议中断web容器线程
标签: java spring multithreading spring-boot