Java Servlet线程

Java Servlet线程,java,multithreading,servlets,producer-consumer,Java,Multithreading,Servlets,Producer Consumer,我已经完成了以下JavaServlet构造:[我相信主要思想是消费者生产者的思想] 接收多个http POST请求的Java servlet 它将所有请求放入一个队列[ConcurrentLinkedQueue] 队列中的所有请求都由单个独立线程(如引擎)处理。该线程独立于servlet工作。 使用单独的线程有一个很好的理由,因为我需要来自多个不同http请求的数据来进行处理。队列等待,直到有足够的请求,然后开始处理 现在我进入了最后一步:一旦独立线程引擎处理了http请求No1,我需要通知特定

我已经完成了以下JavaServlet构造:[我相信主要思想是消费者生产者的思想]

  • 接收多个http POST请求的Java servlet

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

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

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


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

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


    如果您确实希望异步执行操作,则可以使用对象检查计算的完成状态,并获得其结果。

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


    如果您确实希望异步执行操作,则可以使用对象检查计算的完成状态,并获得其结果。

    我不知道这些要求来自何方,但有几种其他更简单的方法来解决此问题:

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

    • 使用Servlet3.0,您可以将整个处理放在异步线程中。这是更具伸缩性的。基本上,您正在提交一个任务并立即释放HTTP线程。异步线程不仅处理队列中的项目,还通过
      AsyncContext
      对象返回HTTP响应


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

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

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

    • 使用Servlet3.0,您可以将整个处理放在异步线程中。这是更具伸缩性的。基本上,您正在提交一个任务并立即释放HTTP线程。异步线程不仅处理队列中的项目,还通过
      AsyncContext
      对象返回HTTP响应

    如果您真的需要使用一个队列和一个单独的线程,请查看Java和。但这是更低级的工作。让servlet创建可调用对象并将其提交给执行器,然后在返回的将来调用
    get()

    Callable<Foo> callable = new Callable<Foo>() {
        // TODO implement call();
    };
    Future<Foo> future = executor.submit(callable);
    Foo result = future.get();
    
    Callable Callable=new Callable(){
    //TODO实现调用();
    };
    未来=执行人提交(可调用);
    Foo result=future.get();
    
    使用一个。让servlet创建可调用对象并将其提交给执行器,然后在返回的将来调用
    get()

    Callable<Foo> callable = new Callable<Foo>() {
        // TODO implement call();
    };
    Future<Foo> future = executor.submit(callable);
    Foo result = future.get();
    
    Callable Callable=new Callable(){
    //TODO实现调用();
    };
    未来=执行人提交(可调用);
    Foo result=future.get();
    
    评论不错。使用单独的线程确实有很好的理由,因为我需要来自多个不同http请求的数据来进行处理。队列等待,直到有足够的请求,然后开始处理。@kostaspap:这是你刚才说的一句非常重要的话,请把它作为你问题的一部分。好的评论。使用单独的线程确实有很好的理由,因为我需要来自多个不同http请求的数据来进行处理。队列等待,直到有足够的请求,然后开始处理。@kostaspap:这是你刚才说的一个非常重要的话,请把它作为你问题的一部分。