我想在java标准库中找到一个方法的示例,该方法将回调作为参数,立即返回,并在完成任务后调用回调。例如,您可以想象一个从键盘获取用户输入的方法,该方法立即返回,但一旦输入就调用回调。
下一个最好的方法是在监听器完成任务后调用监听器。android sdk的一个例子是 SoundPool.load()
以及 SoundPool.setOnLoadCompleteListener()
.
我不考虑像这样的摇摆方法 addActionListener()
举例来说,因为该方法的目的是添加侦听器。触发事件是完全独立的。
我的动机是准备一个关于JavaI/o的讲座,并希望对比(1)阻塞,(2)立即返回(有或没有数据),或(3)使用回调的方法。
2条答案
按热度按时间w6mmgewl1#
您正在寻找的一组示例是javanioaynchronouschannel实现。例如:
异步文件通道#锁(a,completionhandler)
异步文件通道#读取(bytebuffer、long、a、completionhandler)
异步文件通道#写入(bytebuffer、long、a、completionhandler)
异步socketchannel#connect(socketaddress,a,completionhandler)
asynchronousserversocketchannel#accept(a,completionhandler)
如您所见,所有这些方法(以及其他未列出的方法)都使用提供的completionhandler来通知调用方操作完成,无论操作成功还是失败。这些方法中的大多数(如果不是全部的话)都有一个重载,它不接受
CompletionHandler
而是返回一个Future
.还有java.util.concurrent.completionstage,它有许多方法,在阶段完成后调用一些函数接口实现。
bjp0bcyl2#
java标准库通常使用
Future
抽象而不是回调作为核心构建块。如果您想构建一个“基于回调”的结构,那么可以使用then*
上的方法CompletionStage
(通常CompletableFuture
).这种结构允许调用者灵活地处理异步结果;例如,我使用它对多个下游api调用进行分散聚集,这些调用用于构建复合结果。