java

时间:2018-04-05 06:35:43

标签: java

我尝试在登录失败的情况下进行简单的超时。 这是伪代码。

class A {
        public A() {
            int timeOutSeconds = 10;
            try {
                B b = new B(timeOutSeconds);
            }catch (Exception e){
                //detect Time out as well
            }
        }
}

class B{

    boolean loggedIn = false;
    public B(int seconds) {
        asyncLogin(); //this will set loggedIn true
        //how do I use seconds here
        long startTime = System.currentTimeMillis();
        while (!isLoggedIn()) {
            if(System.currentTimeMillis() - startTime > (seconds*1000)){
                throw  new RuntimeException("Time Out");
            }
        }
    }
    private boolean isLoggedIn() {
        return loggedIn; //set asynchronously
    }
}

有没有标准的方法呢?

我已经完成了答案herehere,但它们看起来并不像我所做的那样简单或相同。

如果有更好/标准的方法可以做到这一点,我会很想知道为什么我的方法不那么好。

1 个答案:

答案 0 :(得分:0)

一种适当的方法是忘记所有繁忙的等待和其他可怕的代码,并在登录任务完成时通知线程。

的内容
private final Object lock = new Object();
boolean loggedIn = false;
public B(int seconds) {
    asyncLogin();

    synchronized(lock) {
        lock.wait(seconds * 1000);
    }
    if(!loggedIn) // Timeout expired without login
        throw new TimeoutException("Couldn't login");
    ... // Do things
}

public void logIn() {  // Called by the login thread
    synchronized(lock) {
        loggedIn = true;
        lock.notifyAll();
    }
}