看看CountDownLatch。您可以使用以下类似方式模拟所需的同步行为:
private CountDownLatch doneSignal = new CountDownLatch(1);void main() throws InterruptedException{ asyncDoSomething(); //wait until doneSignal.countDown() is called doneSignal.await();}void onFinishDoSomething(){ //do something ... //then signal the end of work doneSignal.countDown();}您还可以通过
CyclicBarrier2个参与者使用相同的行为,如下所示:
private CyclicBarrier barrier = new CyclicBarrier(2);void main() throws InterruptedException{ asyncDoSomething(); //wait until other party calls barrier.await() barrier.await();}void onFinishDoSomething() throws InterruptedException{ //do something ... //then signal the end of work barrier.await();}但是,如果您可以控制
asyncDoSomething()I
的源代码,建议您重新设计它以返回一个
Future<Void>对象。这样,您可以在需要时轻松地在异步/同步行为之间进行切换,如下所示:
void asynchronousMain(){ asyncDoSomethig(); //ignore the return result}void synchronousMain() throws Exception{ Future<Void> f = asyncDoSomething(); //wait synchronously for result f.get();}


