当前位置: 首页 > 知识库问答 >
问题:

ExecutorService。提交(任务)vs CompletableFuture。SupplySync(任务、执行者)

邹嘉石
2023-03-14

要并行或异步运行一些东西,我可以使用ExecutorService:

除了返回类型“未来”与“可完成的未来”之外,还有任何显著差异。或者什么时候用什么?

如果使用带默认执行器的CompletableFuture API(不带执行器的方法),会有什么区别?


共有3个答案

白青青
2023-03-14

这让我更清楚了未来和可完成未来之间的区别:未来和promise之间的区别

可完成的未来更像是一个promise。

唐阳晖
2023-03-14

CompletableFuture具有丰富的功能,如链接多个future、组合future、在future执行后执行某些操作(同步和异步)等。

但是,CompletableFuture在性能方面与Future没有什么不同。即使组合了CompletableFuture的多个实例(最后使用. thenComine和. join),除非我们调用. get方法,否则它们都不会被执行,在此期间,调用线程被阻塞。我觉得在性能方面,这并不比Future好。

如果我在这里缺少某些方面的表现,请告诉我。

吴升
2023-03-14
匿名用户

除了收益型期货与完全型期货有显著差异外。或者什么时候用什么?

其实很简单。当希望执行线程等待异步计算响应时,可以使用Future。这方面的一个示例是并行合并/排序。向左异步排序、向右同步排序、向左等待完成(future.get()),合并结果。

当您希望从执行的线程异步执行某些操作,并在完成后得到结果时,可以使用CompleteableFuture。例如:我想异步进行一些计算,在计算时,将结果写入某个系统。请求线程可能不需要等待结果。

您可以在未来的单个可执行文件中模拟上述示例,但CompletableFuture提供了更流畅的界面和更好的错误处理。

这真的取决于你想做什么。

如果使用带默认执行器的CompletableFutureApi(不带执行器的方法),有什么区别?

它将委托给ForkJoin。commonPool()是系统上CPU数量的默认大小。如果您正在执行IO密集型操作(读取和写入文件系统),那么应该以不同的方式定义线程池。

如果是CPU密集型的,那么使用commonPool最有意义。

 类似资料:
  • 我正在尝试将一个任务提交给Java的ExecutorService。它要么需要一个Callable,它允许抛出异常,要么需要一个Runnable。我的用例是愚蠢的:我想安排一个抛出异常的任务,但它是一个无效的方法。因此,我不能使用Callable或Runnable,因为方法定义与我的用例不匹配。我还想让我的异常从提交后收到的Future传播。有什么想法吗?

  • 向ExecutorService对象提交任务的执行顺序是什么? 场景:让我们暂时假设Executor线程池大小为5,我已经向它提交了20个可运行任务,我们知道一次只能执行5个任务,其余的任务将在bucket中等待。所以我的问题是提交的任务以什么顺序执行。它是遵循FIFO数据结构还是从bucket中随机选取任务。 还有,有没有办法指定它应该以什么顺序执行。 例子:

  • 我一直在寻找这样一种情况的解决方案:我有一个调用项的哈希集,并且我要将这个集提交给执行器进行并行执行。现在我想只要任何提交的任务完成,我应该能够分配一个新的Callable到Executor。 我尝试了这段代码,但是如果我使用Executor.Invoke,那么Executor将等待直到所有任务完成,如果我使用Executor.Submit,那么任务将按顺序完成。如有任何帮助,我们将不胜感激。

  • 问题内容: 我有三个连接的线程,即第二个线程在第一个死后执行。 这是我的代码: 我将如何使用而不是三个线程对象来实现此功能? 问题答案: 如果您想要/需要的是一个接一个地执行一组作业,但要在与主应用程序线程不同的单个线程中执行,请使用。

  • 我使用java.util.concurrent.ExecutorService和固定线程池来执行任务列表。我的任务列表通常在80-150个左右,我已经将任何时候运行的线程数限制为10个,如下所示: 我的用例要求即使完成的任务也应该重新提交给ExecutorService,但是只有当所有已经提交的任务都被服务/完成时,才应该再次执行/获取。也就是说,提交的任务基本上应该轮流执行。因此,在这种情况下不

  • 我正在使用sping-boot,我有这样一个用例,我想将列表的每个元素提交给执行器服务(线程池大小=4)。但是在每个必须处理的元素之间,我想要1秒钟的延迟。 Thread.sleep(1000)不工作,因为执行程序一睡觉就启动另一个线程。 编辑:这是我的process()方法,我在最后尝试使用sleep,但没有成功。