微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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的更多信息。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。