首页
学习
活动
专区
圈层
工具
发布

Java线程
EN

Stack Overflow用户
提问于 2012-07-22 13:38:43
回答 3查看 1.2K关注 0票数 0

我已经完成了以下Java构建:我相信主要思想是消费者生产者的概念。

  1. 接收多个http POST请求的Java servlet
  2. 它将所有请求放入一个队列ConcurrentLinkedQueue中。
  3. 队列中的所有请求都由一个独立的线程(如引擎)处理。这个线程独立于servlet工作。有一个很好的理由需要单独的线程,因为我需要来自几个不同的http请求的数据来进行处理。队列等待直到有足够的请求,然后开始处理。

现在,我进入了最后一步:一旦独立的线程引擎处理了http请求No1,我需要通知它来自哪个特定的servlet线程(例如No1),以便我能够回答,即将响应发送回相应的客户端。

如何解决这个线程问题?单线程引擎如何每次通知正确的servlet线程?我该怎么编码这个?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-22 13:44:12

我不知道这些需求是从哪里来的,但是有几种解决这个问题的更简单的方法:

  • 使用ExecutorService。只需向池提交一个任务并阻止返回的Future对象。非常简单有效。一旦您的任务就绪,Future.get()将返回结果
  • 使用Servlet3.0,您可以将整个处理放在异步线程中。这是更具有可伸缩性。基本上,您正在提交一个任务,并立即释放HTTP线程。异步线程不仅处理队列中的项,而且还通过AsyncContext对象返回HTTP。

如果确实需要使用队列和单独的线程,请查看Java锁,锁条件。但这是更低层次的工作。

票数 2
EN

Stack Overflow用户

发布于 2012-07-22 13:44:31

使用SingleThreadExecutor。让servlet创建可调用对象并将它们提交给执行器,然后在返回的未来调用get()

代码语言:javascript
复制
Callable<Foo> callable = new Callable<Foo>() {
    // TODO implement call();
};
Future<Foo> future = executor.submit(callable);
Foo result = future.get();
票数 1
EN

Stack Overflow用户

发布于 2012-07-22 13:42:39

是否有很好的理由让您在单独的线程中有一个队列来执行这项工作?如果servlet需要等待处理结果才能将响应返回给客户端,那么为什么不直接在同一个线程中执行处理并同步返回结果呢?

如果您真的想异步地完成一些事情,可以使用未来对象来检查计算的完成状态,并获得其结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11600737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档