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

如何将可调用任务提交给ExecutorService超时

宦琪
2023-03-14

我将可调用任务(使用submit())提交给ExecutionService的实现。有时我似乎遇到了死锁,但无法工作在哪里或为什么会发生,所以我想为任务设置一个超时,我不清楚是如何做到的?

我应该吗

  1. 在提交任务时,在ExecutionService上使用invokeAny()而不是submit()并设置超时。我使用submit()一次提交许多任务,我是否也可以这样使用invokeAny(),我很谨慎,因为我不明白为什么没有submit()方法需要超时。
  2. 在ExecutorService的构造函数中修改keepAliveTime(但我认为这是在执行其他操作
  3. 修改我的实际可调用实现,但如果它被死锁,它就不能解除自己的死锁。

方案1似乎是唯一可行的解决办法,但它是吗?

更多详细信息

我认为有必要更详细地解释这个过程是如何工作的,以防它有助于解决问题。

可调用任务P1启动并在一个文件夹上工作,其中的所有文件和文件夹开始将歌曲分组,它在ExecutorService ES1内运行,并且只有P1的一个实例提交给ES1。

我们还有另外三个可调用的类:P2、P3和P4-每个类都有自己的相关的执行器服务ES2、ES3和Es4)。一旦P1创建了一个组,它就将一个任务提交给相关的ES并将该组作为数据传递,也就是说,它可以将P2的实例提交给E2、P3或P3或P4给E4,它选择哪一个取决于分组的细节,P2、P3和P4都做不同的事情。

假设它已经提交了P2的实例,P2将通过将P3提交给E3或将P4提交给E4来完成处理。它是单向流水线P3只能提交给P4,一旦所有任务都提交给P4,并且P4完成了所有任务,处理也就完成了。

我们通过构造ES1、ES2、ES3和ES4来完成处理,向P1提交任务,然后依次对每个ExecutorService调用shutdown(),这样,shutdown()在P1完成提交所有组之前不会返回,然后在ES2上调用shutdown(),直到ES2清除了P2任务ecetera的队列之后才返回。

我假设某个进程停止了其他进程的继续,所以在这一点上,我想要一种方法来取消那些花费太长时间的进程,这样其他进程就可以继续了,这比它无限期地挂起要好得多

回答得更新

我试着按照建议使用invokeAny(),它有点起作用。如果P1将P2的一个实例提交给E2,它会在完成之前等待,这是可以的,因为当使用submit()时,它只是以任何方式返回那里,它不会进一步处理,但有两个问题:

>

  • 每个ExecutorService都使用一个500的有界队列,其思想是如果P2比P1慢得多,我们就不会继续将内容堆叠到ES2上,最终耗尽内存。因此,现在P1在它们调用的任务完成之前不会完成,队列实际上更小了,因为它们不只是由等待ES2上的插槽完成的任务组成,而是包含已经提交到ES2但正在等待它完成的任务。

    管道是链接的,所以如果我们对从P1提交的任务以及从P2、P3和P4提交的任务使用invokeAny,那么当一个任务从P1提交到P2时,它将不会返回,直到后续处理从E4完成!

  • 共有1个答案

    宋唯
    2023-03-14

    您可以使用Guava的MoreExecutorsListeningExecutorService。它不会神奇地解决你的问题,但可以提供一些帮助:

    1)您可以为通过InvokeAll调用的每个callable设置一个超时。如果在给定时间内未完成调用,则应将其杀死。

    2)您可以创建一个所有ListenableFuture的全局映射,其中每个ListenableFuture都将在创建时注册一个标志,并在完成时清除该标志。这样,您就可以知道哪些futures没有完成,这有助于缩小问题的范围。

     类似资料:
    • > 在将所有内容提交给后, 在上调用 则在shutdown()之前提交的所有任务都实际完成运行之前,awaitTermination()才返回。--然后在上调用,但是由于提交给的所有任务都已完成,并且从上的任务中提交给的所有任务都已提交给,所以在上调用之前,所有任务都已提交给。--对于以此类推 但是,我现在添加了这样一种情况,即可以将datapacket分解成一个较小的包,并在上提交额外的任务,而

    • 我已经使用ExecutorService实现了超时任务。在下面的方法中,我正在提交超时任务,如果它在给定的时间内超时,我将取消该任务并关闭执行器。 它运行得很好,我没有任何问题。 然而,我想知道这是否是最好的代码设计。我只是想知道如果使用ExecutorService返回的未来是否会更好。submit()获取可调用函数的返回值或超时超时任务。例如 我正在使用JDK7。

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

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

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