是否可以阻止/等待一个已经存在的异步功能?

问题描述

SomeLibrary lib = new SomeLibrary();
lib.doSomethingAsync(); // some function from a library I got and what it does is print 1-5 asynchronously
System.out.println("Done");

// output
// Done
// 1
// 2
// 3
// 4
// 5

我想清楚一点,我没有执行doSomethingAsync()函数,这是我无法更改的。我想找到一种方法来阻止此异步功能,并在数字1到5之后打印Done,因为正如您所见,Done会立即被打印。用Java有办法做到这一点吗?

解决方法

您可以按以下方式使用CountDownLatch

final CountDownLatch wait = new CountDownLatch(1);
SomeLibrary lib = new SomeLibrary(wait);
lib.doSomethingAsync(); // some function from a library I got and what it does is print 1-5 asynchronously
//NOTE in the doSomethingAsync,you must call wait.countDown() before return
wait.await(); //-> it wait in here until wait.countDown() is called.
System.out.println("Done");

在构造器SomeLibrary 中:

private CountDownLatch  wait;
public ScannerTest(CountDownLatch  _wait) {
    this.wait = _wait;
}

在方法doSomethingAsync()中:

public void doSomethingAsync(){
   //TODO something
   ...
   this.wait.countDown();
   return;
}
,

这是通过标准库中的几种方法实现的:-

完成回调

客户端通常可以在异步任务完成后调用提供程序功能。此功能通常会在输入时接收一些有关已完成工作的信息。

Future.get()

异步功能返回Future进行客户端同步。您可以阅读有关here的更多信息。

请检查是否有这些选项中的任何一个可用(也许是您要调用的方法中的重载版本?_。库同时包含某些业务逻辑的同步版本和异步版本并不少见,因此可以搜索为此。