【问题标题】:Can we stop backend thread?我们可以停止后端线程吗?
【发布时间】:2019-04-03 14:18:52
【问题描述】:

在我的 spring boot 项目中,我有以下 GET web 服务

@GetMapping("/testThread")
@Transactional
public Map<String, Object> testThread(HttpServletRequest request) throws InterruptedException {

for (int i=0;i<10;i++){
    Thread.sleep(3000);
    System.out.println(i);
}
    return null;
}

我从邮递员那里调用这个网络服务,并且网络服务线程内部正在启动,线程正在运行 10 次。

我的要求是在 10 秒后从邮递员那里调用网络服务后,我可以通过“取消请求”按钮取消该请求,然后后端线程也应该停止。

到目前为止,它已经运行了 10 次。

我们是否有任何选项可以在两者之间停止执行此循环?

【问题讨论】:

  • 实际上我不是在谈论线程,我们可以说它的后台进程,如果我从邮递员那里点击休息服务,那么这个循环将开始,5 -10 秒后我取消请求。那我们有什么办法可以停止这个循环的执行吗?
  • 使用 ExecutorService 并将您的工作提交给 id,生成 ID 并将其与 ExecutorService 返回的 Future 关联。使用另一个 REST 调用根据生成的 ID 请求取消。
  • @rkosegi 您能否再简单介绍一下,我如何生成 id 以及如何与 executor 服务关联以及如何通过使用另一个休息来取消它?如果您可以为此提供一些代码示例,那就太好了。

标签: java multithreading spring-boot


【解决方案1】:

一个简单的解决方案是从 testThread 方法中获取线程的 id,可能使用方法:

Thread.currentThread().getId()

在此之后,您可以创建另一个接受输入中的 id 线程并将其终止的 Rest Controller。 但这不是一个安全的解决方案

【讨论】:

  • 杀死线程是错误的模式stackoverflow.com/questions/671049/…
  • @Parad ok.. 所以我应该使用 stop 方法杀死线程吗?
  • @harish-bagora 这可能是一个解决方案,但不是一个好的解决方案。在这里你可以找到一个很好的例子:link
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多