小编典典
异步代码始终可以使同步。最简单/最简单的方法是进行异步调用,然后进入一个while循环,该循环仅使当前线程休眠,直到返回值为止。
编辑: 将异步回调转换为同步代码的代码-还是粗略的实现:
import java.util.concurrent.*;
public class MakeAsynchronousCodeSynchronous {
public static void main(String[] args) throws Exception {
final Listener listener = new Listener();
Runnable delayedTask = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new IllegalStateException("Shouldn't be interrupted", e);
}
listener.onResult(123);
}
};
System.out.println(System.currentTimeMillis() + ": Starting task");
Executors.newSingleThreadExecutor().submit(delayedTask);
System.out.println(System.currentTimeMillis() + ": Waiting for task to finish");
while (!listener.isDone()) {
Thread.sleep(100);
}
System.out.println(System.currentTimeMillis() + ": Task finished; result=" + listener.getResult());
}
private static class Listener {
private Integer result;
private boolean done;
public void onResult(Integer result) {
this.result = result;
this.done = true;
}
public boolean isDone() {
return done;
}
public Integer getResult() {
return result;
}
}
}
您也可以按照hakon的答案建议使用CountDownLatch。它将做基本上相同的事情。我还建议您熟悉java.util.concurrent包,以获取更好的线程管理方法。最后,仅仅因为您 可以
做到这一点就不是一个好主意。如果您正在使用基于异步回调的框架,那么与学习如何有效使用框架相比,尝试颠覆它可能要好得多。
2020-12-03