Java 在释放锁后强制下一个线程的最小等待时间?

Java 在释放锁后强制下一个线程的最小等待时间?,java,multithreading,web-services,thread-safety,locking,Java,Multithreading,Web Services,Thread Safety,Locking,我向Web服务发出请求,请求之间的最小等待时间为200毫秒。我想在我的多线程应用程序中强制执行此策略。目前我的应用程序中有以下代码: lock.lock(); String resp = httpUtility.makeGetRequest(serviceUrl); //make request to service lock.unlock() //timer should start after thread exits this 如果有一个线程出现在这里,我希望它立即通过。如果线程退出lo

我向Web服务发出请求,请求之间的最小等待时间为200毫秒。我想在我的多线程应用程序中强制执行此策略。目前我的应用程序中有以下代码:

lock.lock();
String resp = httpUtility.makeGetRequest(serviceUrl); //make request to service
lock.unlock() //timer should start after thread exits this
如果有一个线程出现在这里,我希望它立即通过。如果线程退出lock.unlock(),那么我希望它启动一个200ms的计时器。在此期间,任何线程都不应通过
lock.lock()

我还希望队列公平,所以我不能只使用
wait()
notify()
。另一方面,
Lock
也不好,因为只有获取线程可以释放
Lock
,我不想让线程暂停200ms

    @Override
    public void run() {

        while (true) {
            String currentRequestUrl = null;
            if (!requestUrls.isEmpty()) {
                currentRequestUrl = requestUrls.remove(0);
            } else {
                try {
                    Thread.sleep(1);  //give CPU a break
                } catch (InterruptedException e) {
                }
            }

            if (currentRequestUrl != null) {
                System.out.println("##Simulating calling " + currentRequestUrl);
                System.out.println("##Request to " + currentRequestUrl + " is complete.");
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                }
            }
        }
    }

实现这一点的好方法是什么?

我将创建一个
while(true)
循环,该循环将在单独的线程中执行每个新请求,然后休眠200ms,例如

try {
    while (true) {
        executor.execute(requestQueue.take());
        Thread.sleep(200);
    }
} catch (InterruptedException ex) {...}

我将创建一个
while(true)
循环,它将在一个单独的线程中执行每个新请求,然后休眠200ms,例如

try {
    while (true) {
        executor.execute(requestQueue.take());
        Thread.sleep(200);
    }
} catch (InterruptedException ex) {...}

Artyom的回答很好,但我认为你的问题意味着你有几个线程想要发出GET请求

在这种情况下,创建一个实现Runnable的RequestHandler类,例如线程本身。让每个工作线程获取此RequestHandler类的单实例。比如:

RequestHandler requestHandler = new RequestHandler();
new Thread(requestHandler).start(); //your one and only of this class
然后,在RequestHandler中创建一个简单的列表/队列。工作人员创建新请求时,只需将请求排队:

class RequestHandler implements Runnable {

    List<String> requestUrls = new ArrayList<String>();

    public void submitRequest(String url) {
        System.out.println("===>Request incoming for " + url);
        requestUrls.add(url);
    } 
所以,现在,每次创建一个Worker时,请确保将此“singleton”RequestHandler传递给它

class Worker implements Runnable {

    private String url;
    private RequestHandler requestHandler;

    Worker(String url, RequestHandler requestHandler) {
        this.url = url;
        this.requestHandler = requestHandler;
    }
当工作者准备提交请求时,它调用RequestHandler

    requestHandler.submitRequest(url);

Artyom的回答很好,但我认为你的问题意味着你有几个线程想要发出GET请求

在这种情况下,创建一个实现Runnable的RequestHandler类,例如线程本身。让每个工作线程获取此RequestHandler类的单实例。比如:

RequestHandler requestHandler = new RequestHandler();
new Thread(requestHandler).start(); //your one and only of this class
然后,在RequestHandler中创建一个简单的列表/队列。工作人员创建新请求时,只需将请求排队:

class RequestHandler implements Runnable {

    List<String> requestUrls = new ArrayList<String>();

    public void submitRequest(String url) {
        System.out.println("===>Request incoming for " + url);
        requestUrls.add(url);
    } 
所以,现在,每次创建一个Worker时,请确保将此“singleton”RequestHandler传递给它

class Worker implements Runnable {

    private String url;
    private RequestHandler requestHandler;

    Worker(String url, RequestHandler requestHandler) {
        this.url = url;
        this.requestHandler = requestHandler;
    }
当工作者准备提交请求时,它调用RequestHandler

    requestHandler.submitRequest(url);