Java 等待性。等待()。如果超时间隔到期,atMost(…)会导致程序退出吗?
这个问题与com.jayway.waitibility.waitibility有关 我刚试过等待,它似乎有一些奇怪的行为。 在下面的测试方法中,如果我注释掉testWithFuture()并启用 TestWithWaitibility(),我从未看到打印出来的消息“end”。 我看到“开始”,然后程序就退出了,第二个 打印语句似乎永远也达不到 因此,作为一种解决方法,我决定使用可设置的{Future}。。如果其他人也有同样的问题,那么我提供的工作可能会很有用。。最好能得到一个好的答案;^)!提前谢谢/克里斯 守则:Java 等待性。等待()。如果超时间隔到期,atMost(…)会导致程序退出吗?,java,multithreading,unit-testing,concurrency,Java,Multithreading,Unit Testing,Concurrency,这个问题与com.jayway.waitibility.waitibility有关 我刚试过等待,它似乎有一些奇怪的行为。 在下面的测试方法中,如果我注释掉testWithFuture()并启用 TestWithWaitibility(),我从未看到打印出来的消息“end”。 我看到“开始”,然后程序就退出了,第二个 打印语句似乎永远也达不到 因此,作为一种解决方法,我决定使用可设置的{Future}。。如果其他人也有同样的问题,那么我提供的工作可能会很有用。。最好能得到一个好的答案;^)!提前
import com.google.common.util.concurrent.SettableFuture;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static com.jayway.awaitility.Awaitility.await;
import static java.util.concurrent.TimeUnit.SECONDS;
public class AwaitTest {
static volatile boolean done = false;
public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
testWithFuture();
//testWithAwaitility();
}
private static void testWithAwaitility() {
System.out.println("start " + new Date());
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
done = true;
}
}).start();
await().atMost(2, SECONDS).until(new Callable() {
@Override
public Boolean call() throws Exception {
return done;
}
});
System.out.println("end " + new Date()); // NEVER Reached. i wonder why?
}
// This does what I want.
//
private static void testWithFuture() throws InterruptedException, ExecutionException, TimeoutException {
System.out.println("start testWithFuture");
final SettableFuture future = SettableFuture. create();
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
future.set("Hello");
}
}).start();
String result = future.get(4, TimeUnit.SECONDS);
if (! result.equals("Hello")) {
throw new RuntimeException("not equal");
} else {
System.out.println("got Hello");
}
}
}
更正代码->
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static com.jayway.awaitility.Awaitility.await;
import static java.util.concurrent.TimeUnit.SECONDS;
public class Sample {
static volatile boolean done = false;
public static void main(String[] args) {
testWithAwaitility();
}
private static void testWithAwaitility() {
System.out.println("start " + new Date());
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
done = true;
}
}).start();
try {
await().atMost(2, SECONDS).until(new Callable() {
@Override
public Boolean call() throws Exception {
return done;
}
});
} catch (Exception e) {
System.out.println("FAILED");
e.printStackTrace();
}
System.out.println("end " + new Date()); // REACHED this statement after correction
}
}
根据,await()
在达到超时且条件不为true时抛出一个TimeoutException
,因此您的方法在这一点结束,因为异常通过堆栈向上传播。这就解释了这种行为。但是,您应该看到一个stacktrace
如果要在之后继续执行代码,似乎需要捕获此异常。根据,await()
在达到超时且条件为非真时抛出一个TimeoutException,因此您的方法在此时结束,因为异常通过堆栈向上传播。这就解释了这种行为。但是,您应该看到一个stacktrace
如果要在以后继续执行代码,似乎需要捕获此异常。捕获异常有效。我用你建议的更正编辑了原文。谢谢。捕捉异常很有效。我用你建议的更正编辑了原文。非常感谢。