【问题标题】:Spring threads interruption弹簧线程中断
【发布时间】: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


【解决方案1】:

不要打断你不知道后果的线程。

可以为您创建、启动并且知道副作用的线程完成。

【讨论】:

  • 是的,我就是这么想的,但我更感兴趣的是如果我打断了 Spring 的线程会如何表现?
  • 我认为在这种情况下没有一种独特的行为。如果您有事务,它们可能会在此过程中回滚......或者没有。如果线程的状态被保存在某个地方,这些线程也可能开始失败。没有可靠的方法来判断 Spring 将做什么,并且这种行为可能会因版本而异。如果您纯粹出于好奇想知道 Spring 的行为方式……嗯……您必须尝试一下,因为结果可能与您自己的特定场景相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
相关资源
最近更新 更多