问题描述
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的更多信息。
请检查是否有这些选项中的任何一个可用(也许是您要调用的方法中的重载版本?_。库同时包含某些业务逻辑的同步版本和异步版本并不少见,因此可以搜索为此。