Java ExecutionrCompletionService take.get() 从不同的线程

标签 java concurrency java.util.concurrent

在 Java 中,我有一个 Web 服务,它在不同的线程上启动一些长时间运行的进程,以便我可以返回 http 状态而不会出现连接超时。

我的问题涉及创建一个长时间运行的线程,该线程将简单地运行 ExecuterCompletionService.take.get() 来获取已完成的线程并完成对它们的处理。

如果在主线程中创建完成服务,可以在该单独的线程中运行获取完成的对象吗?

EG。

主线程

  1. 创建完成服务
  2. 接受请求并创建长时间运行的流程
  3. 将 Callable 提交给完成服务
  4. 如果一切顺利,返回 HTTP 状态 200

监控线程

  1. 存储对主线程中创建的完成服务的引用。
  2. 运行completionservice.take.get()
  3. 生成已完成任务的报告
  4. 重复

有什么特别需要担心但我忽略了的事情吗?比如同步问题。我知道内部完成服务使用阻塞队列。

最佳答案

恕我直言,只要您保留一个用于提交多个可调用作业的 ExecutorCompletionService 实例,我认为您的方法没有问题。

在这种方法中,当服务器宕机/崩溃时,您将丢失正在运行的作业结果。您将使用 JVM 内存来保持作业的运行。同样,这取决于请求量和并行运行的作业数量以及完成任务所需的时间。

如果您不需要并行运行所有请求,那么对于您的用例,JMS 将是完美的选择。为了避免长时间运行的进程请求超时,我们可以将作业放在JMS中,稍后可以通过JMSlistener(消息监听器/MDB)消费该作业并一一处理。

关于Java ExecutionrCompletionService take.get() 从不同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23392240/

相关文章:

C - 线程的并发问题,参数被打印两次

java - 为什么有人会在方法中制作本地最终锁定?

python - 在 Google Colab 中运行 2 个 python 脚本

c# - 到 "broadcast"到 TCP 客户端列表的最快方法

java - 如何从 ScheduledExecutorService 获取队列和池大小

java - 在 run() 中中断当前线程不会抛出 InterruptedException

java - 正则表达式疯狂 : java. util.regex.Pattern 匹配器进入高 CPU 循环

java - Charset.defaultCharset() 在 JDK1.7 和 JDK 1.6 下得到不同的结果

java - COMPASs Monitor 不显示任何应用程序

java - apache spark 与 kafka 和 hive 集成的 Spark 流