如果满足某些条件,请等待?

时间:2013-10-15 12:55:32

标签: java multithreading wait httpurlconnection

我不确定我的方法是否正确,所以我会尽力描述问题。

我正在编写连接到服务器的客户端。它经常发出一些(不同的)请求。有些可能会发生请求太多,所以我不得不重新登录。 登录由请求标头中设置的令牌验证。

我想实现类似锁定/等待对象的东西。大多数请求在单独的线程中运行,但通过相同的函数发送(最终)请求。在这个函数中,我检查响应的有效性,如果服务器决定踢我,我发送重新登录请求。

我的问题:如果响应无效,我会异步重新登录(响应的JavaFX回调)并继续。 由于多线程任务,可能存在这样的情况:2个(或更多)请求获得相同的无效响应并尝试重新登录,或者一个任务尝试执行请求而另一个请求正在登录(因此没有有效的令牌),收到无效响应,开始登录而另一个收到有效登录,一个在新登录期间失效,依此类推。

如何强制我的任务等到另一个请求的登录完成后?最好的方法是什么?

谢谢并抱歉语法!

2 个答案:

答案 0 :(得分:1)

这似乎是访问共享资源的一种情况。你对锁定/等待的直觉是正确的。同步方法似乎是一个很好的解决方案。如果不是,请使用Semaphore

答案 1 :(得分:0)

假设您有一个负责登录的中央班级,您可以使用可重入锁来管理:

private final ReentrantReadWriteLock loginLock = new ReentrantReadWriteLock();

public boolean isLoggedIn() {
    loginLock.readLock().lock();
    try {
        return loggedIn;
    }
    finally {
        loginLock.readLock().unlock();
    }
}

public void login () {
    loginLock.writeLock().lock();
    try {
        if (!isLoggedIn()) {
            performLogin();
        }
    }
    finally {
        loginLock.writeLock().unlock();
    }
}