CompletableFuture如何解决FutureTask的get等待
时间: 2023-06-20 07:04:56 浏览: 43
CompletableFuture使用回调函数的方式来解决FutureTask的get等待。
在使用CompletableFuture时,我们可以通过thenApply、thenAccept、thenRun等方法来添加回调函数,这些回调函数会在异步任务执行完成后自动执行。当异步任务执行完成后,回调函数会被添加到一个回调函数队列中,等待主线程获取异步任务结果时执行。
当主线程调用CompletableFuture的get方法获取异步任务结果时,如果异步任务已经执行完成,主线程会立即获取到结果。如果异步任务还没有执行完成,主线程会阻塞等待异步任务执行完成并返回结果。在异步任务执行完成后,回调函数队列中的回调函数会被自动执行,从而实现了异步任务和回调函数的协同工作。
相关问题
线程池使用FutureTask get不阻塞
线程池使用`FutureTask.get()`方法是阻塞的,它会等待任务执行完成并返回结果。如果你的`get()`方法不阻塞,可能有以下几种原因:
1. 任务已经执行完成:在调用`get()`之前,你可以先使用`isDone()`方法检查任务是否已经完成,如果已经完成,则`get()`方法会立即返回结果。
2. 任务执行超时:`get()`方法可以设置一个超时时间,如果超过这个时间任务还没有执行完成,则会抛出`TimeoutException`异常。
3. 任务抛出异常:如果任务执行过程中抛出了异常,`get()`方法会将异常重新抛出,你可以通过捕获异常来处理。
请确保你正确地使用了`FutureTask.get()`方法,并检查以上可能导致不阻塞的情况。如果问题仍然存在,请提供更多的代码和上下文信息以便我能够更好地帮助你。
FutureTask 和 CompletableFuture
FutureTask和CompletableFuture都是用于异步获取线程执行结果的工具。
FutureTask实现了Future接口,并且还实现了Runnable接口,所以可以直接将FutureTask提交到线程池执行,并且可以获取执行结果。而Future只支持获取Callable的执行结果。所以从功能上来说,FutureTask更加全面且方便。FutureTask的底层是基于AQS(AbstractQueuedSynchronizer)实现的。
为了满足对异步编程的需求,JDK8引入了CompletableFuture。CompletableFuture是在JDK1.8之后出现的,与之前的Future和FutureTask有很大的区别。CompletableFuture的功能更加强大且复杂,融入了大量的流式编程思想。可以等待多个CompletableFuture对应的计算结果都出来后再做一些操作。
总结来说,FutureTask和CompletableFuture都是用于异步获取线程执行结果的工具,但是CompletableFuture的功能更加丰富和灵活。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [Future,FutureTask,CompletableFuture](https://blog.csdn.net/XH413235699/article/details/97302732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* [【异步编程学习笔记】JDK中的FutureTask和CompletableFuture详解(使用示例、源码)](https://blog.csdn.net/qq_41358574/article/details/120521955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]