【问题标题】:Java Servlet threadingJava Servlet 线程
【发布时间】:2012-07-22 13:38:43
【问题描述】:

我已经完成了如下Java Servlet的构建:【我相信主要是consumer-producer的思路】

  1. 接收多个 http POST 请求的 Java servlet

  2. 它将所有请求放入一个队列[ConcurrentLinkedQueue]

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

现在我进入了最后一步:曾经,例如http请求No1已经被独立线程引擎处理了,我需要通知它来自的具体servlet线程(例如No1)以便我可以回复,即将响应发送回对应的客户端。

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

【问题讨论】:

    标签: java multithreading servlets producer-consumer


    【解决方案1】:

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

    • 使用ExecutorService。只需将任务提交到池并阻止返回的Future 对象。非常简单有效。一旦您的任务准备就绪,Future.get() 将返回结果

    • 使用 Servlet 3.0,您可以将整个处理置于异步线程中。这更多更具可扩展性。基本上你正在提交一个任务并立即释放 HTTP 线程。异步线程不仅处理该队列中的项目,还通过AsyncContext 对象返回HTTP 响应。

    如果您确实需要使用队列和单独的线程,请查看 Java locksconditions。但这是更多的低级工作。

    【讨论】:

      【解决方案2】:

      使用SingleThreadExecutor。让您的 servlet 创建 Callable 对象并将它们提交给执行程序,然后在返回的 Future 上调用 get()

      Callable<Foo> callable = new Callable<Foo>() {
          // TODO implement call();
      };
      Future<Foo> future = executor.submit(callable);
      Foo result = future.get();
      

      【讨论】:

        【解决方案3】:

        您是否有充分的理由在单独的线程中设置队列来执行工作?如果 servlet 需要等待处理结果才能向客户端返回响应,那为什么不在同一个线程中执行处理并同步返回结果呢?

        如果你真的想异步做事情,你可以使用Future对象来检查计算的完成状态,并获得它的结果。

        【讨论】:

        • 好评。单独的线程确实有充分的理由,因为我需要来自多个不同 http 请求的数据来进行处理。 Queue 一直等待,直到它有足够的请求,然后开始处理。
        • @kostaspap:这是您刚刚发表的非常重要的声明,请将其作为您问题的一部分。
        猜你喜欢
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        相关资源
        最近更新 更多