我从调用外部服务的servlet调用了代码。当然,不能保证服务返回响应需要多长时间。我需要确保一次只能执行一次对此服务的调用,但是servlet容器当然可以运行对servlet的并发请求。我想保证请求的优先级是以先到先得的服务器为基础处理单个文件。因此,我对外部servlet的调用是否同步是不够的,因为一旦当前调用完成,就不能保证哪个线程进入下一个调用。
有什么想法吗?
答案 0 :(得分:5)
你可以使用公平的锁
Lock lock = new ReentrantLock(true);
这会按照尝试的顺序给出锁定。
答案 1 :(得分:4)
您可以single-threaded ExecutorService使用submit Callable(执行实际请求)并等待Future值become available。
答案 2 :(得分:1)
java.util.concurrent中的许多实用程序都适用于这种情况,Semaphore
具有公平性设置是另一种选择
import java.util.concurrent.*;
Semaphore sem = new Semaphore (int n = HOW_MANY_PERMITS, boolean fairness = true);
答案 3 :(得分:0)
在servlet中创建一个工作线程并在那里将标注排入队列。请求处理会在向队列添加请求时同步,然后只是坐在那里等待工作线程报告回来。