Java Servlet线程
我已经完成了以下JavaServlet构造:[我相信主要思想是消费者生产者的思想]Java Servlet线程,java,multithreading,servlets,producer-consumer,Java,Multithreading,Servlets,Producer Consumer,我已经完成了以下JavaServlet构造:[我相信主要思想是消费者生产者的思想] 接收多个http POST请求的Java servlet 它将所有请求放入一个队列[ConcurrentLinkedQueue] 队列中的所有请求都由单个独立线程(如引擎)处理。该线程独立于servlet工作。 使用单独的线程有一个很好的理由,因为我需要来自多个不同http请求的数据来进行处理。队列等待,直到有足够的请求,然后开始处理 现在我进入了最后一步:一旦独立线程引擎处理了http请求No1,我需要通知特定
如何解决这个线程问题?单线程引擎如何每次通知正确的servlet线程?我应该如何编写此代码?是否有充分的理由让您在单独的线程中有一个队列来执行此工作?如果servlet需要等待处理结果,然后才能向客户端返回响应,那么为什么不在同一线程中执行处理并同步返回结果呢
如果您确实希望异步执行操作,则可以使用对象检查计算的完成状态,并获得其结果。在单独的线程中有一个队列来执行该工作,有什么好的理由吗?如果servlet需要等待处理结果,然后才能向客户端返回响应,那么为什么不在同一线程中执行处理并同步返回结果呢
如果您确实希望异步执行操作,则可以使用对象检查计算的完成状态,并获得其结果。我不知道这些要求来自何方,但有几种其他更简单的方法来解决此问题:
- 使用。只需将任务提交到池中,并阻止返回的对象。非常简单有效。一旦任务准备就绪,
将返回结果Future.get()
- 使用Servlet3.0,您可以将整个处理放在异步线程中。这是更具伸缩性的。基本上,您正在提交一个任务并立即释放HTTP线程。异步线程不仅处理队列中的项目,还通过
对象返回HTTP响应AsyncContext
如果您真的需要使用一个队列和一个单独的线程,请查看Java和。但这是更低级的工作。我不知道这些需求是从哪里来的,但有几种其他更简单的方法来解决这个问题:
- 使用。只需将任务提交到池中,并阻止返回的对象。非常简单有效。一旦任务准备就绪,
将返回结果Future.get()
- 使用Servlet3.0,您可以将整个处理放在异步线程中。这是更具伸缩性的。基本上,您正在提交一个任务并立即释放HTTP线程。异步线程不仅处理队列中的项目,还通过
对象返回HTTP响应AsyncContext
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:这是你刚才说的一个非常重要的话,请把它作为你问题的一部分。