当前位置: 首页 > 面试题库 >

建议等待可完成的将来线程完成的推荐方法是什么

闻人昕
2023-03-14
问题内容

我使用CompletableFuture的代码如下所示。但是关于我应该等待所有可运行对象完成的方式,我发现了两种方法,我不知道它们之间的区别,哪种是最佳实践?它们如下:

代码

this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);

等待所有可运行对象完成的第一种方法

this.growSeedExecutor.shutdown();
this.growSeedExecutor.awaitTermination(1, TimeUnit.DAYS);

等待所有可运行对象完成的第二种方法

CompletableFuture.allOf(this.growSeedFutureList).join();

请让我知道推荐哪个。


问题答案:

仅当执行程序(growSeedExecutor)仅用于给定任务时,这两种方法才等效。第一种方法可能导致以下情况:另一个任务需要并行化,并为每个任务创建新的执行程序。一些开发人员发现创建了太多执行程序,并决定使用单个通用执行程序,但未能删除所有执行程序关闭…

因此第二种方法(join())更可靠,因为它不太复杂。但是,每个新的将来都应添加到growSeedFutureList中,而不要分配给它。



 类似资料:
  • 我要做的是异步计算树结构的深度,我将有树的第一层,我想启动一个异步线程来分别计算每个节点的深度。 在计算过程中,树中显然可能有一个分叉,在这一点上,我想踢一个额外的线程来计算那个分支。 我已经得到了这个工作,但我需要做一些整理逻辑,当所有这些未来完成。但我对这一过程中产生的额外的可完成的未来感到困扰。 我会用什么方法来保存所有开始的CompletableFutures+那些动态创建的,并且在执行任

  • 问题内容: 问题描述 : - 步骤1: 在主线程中从用户那里获取输入FILE_NAME。 步骤2: 对该文件执行10个操作(即,计数字符,计数行等。),所有这10个操作必须位于单独的线程中。这意味着必须有10个子线程。 步骤3: 主线程等待,直到所有那些子线程完成。 步骤4: 打印结果。 我做了什么 :- 我用3个线程做了一个示例代码。 我不希望您遇到文件操作代码。 问题:- 我上面的代码没有给出

  • 我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,

  • 问题内容: 我想编写一个后台作业(EJB 3.1),该作业每分钟执行一次。为此,我使用以下注释: 工作正常。 但是,有时该工作可能需要一分钟以上。在这种情况下,计时器仍会触发,从而导致线程问题。 如果当前执行未完成,是否可以终止调度程序? 问题答案: 如果可能只有一个计时器同时处于活动状态,则有两种解决方案。 首先,应该在。在Singleton中,方法默认情况下是写锁定的,因此,当容器中仍有活动时

  • 问题内容: 有时我需要等待一种方法完成,主要是在“加载程序”功能上。这是我这样做的方式: 我忍不住觉得这不是等待a 完成的最佳方法。做这个的最好方式是什么? 问题答案: 如果内没有 异步 代码, 则不是异步代码,例如以下代码: 完成后,您将看到警报。 否则(您内部有异步的东西),可以将循环包装在Promise中: 信用:@ rolando-benjamin-vaz-ferreira

  • 问题内容: 因此,我有一些代码等待X发生,然后创建一个线程并执行processEmail。 我正在寻找的是一种代码,即使processEmail在另一个线程中发生,代码也可以继续等待X,但是当前代码只是等待线程完成,然后再等待X再次发生。 编辑:仅供参考,我什么都不需要在下面的代码中进一步输出processEmail.main(),因此不需要我等待其输出。 由Jean提供的答案:移除main之后的