我尝试在登录失败的情况下进行简单的超时。 这是伪代码。
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
}
}
有没有标准的方法呢?
我已经完成了答案here和here,但它们看起来并不像我所做的那样简单或相同。
如果有更好/标准的方法可以做到这一点,我会很想知道为什么我的方法不那么好。
答案 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();
}
}