gpt4 book ai didi

java - Java 是否提供一个 ExecutorService 允许一个 worker 在同一个线程上执行?

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:31 25 4
gpt4 key购买 nike

我正在寻找 ExecutorService 的实现它将提供以下语义。每个线程都由一个“工作人员”占用,该工作人员根据输入执行某些任务。保证每个 worker 仅在单个线程中执行,因此,应该允许它在任务之间维护状态,而无需同步开销,因为它会在单个线程中与自身同步。

假设我有 100 个输入和 10 个工作人员,我希望能够编写如下内容:

for (Input input: inputs) {
// The following code would pass t to all 10 workers,
// each bound to their own thread,
// and wait for them to complete.
executor.invokeAll(input);
}

请注意,对于任何给定的输入,每个 Worker 都会做不同的事情。输入不是可运行的代码块,它只是 worker 的一个参数。每个 worker 决定如何处理输入。不过,为了使其更简单,工作人员实现了一个接口(interface),允许它被多态调用,接收输入。

我用 Map<Worker, WorkerExecutor> 组合了一些有用的东西, 其中WorkerExecutor我的薄 wrapper 是 Executors.newSingleThreadPool ,并且每个线程池中只会运行一个 Worker 实例。我更愿意找到知道自己在做什么的人写的东西:-)


我可以接受的潜在低效率

我意识到这种语义会导致效率低下,但是,我正试图在开发时间方面获得最大 yield ,并且将 Worker 的每个实现重新设计为线程安全并非易事。我的意思是效率低下,执行可能/将看起来像这样(为此示例模拟最多 2 个 Activity 线程):

         | Task 1    | Task 2    | Task 3    | Task 4    |
Worker 1 | =@ | =@ | =@ | =@ |
Worker 2 | ==@ | ==@ | ==@ | ==@ |
Worker 3 | ==@ | ==@ | ==@ | ==@ |
Worker 4 | =====@ | =====@ | =====@ | =====@ |

问题是 Worker 3 完成后,没有任务要做,并且在 Worker 4 完成之前无法完成任何工作。这可能是 CPU 可以闲置的任意长的时间。


这样的 ExecutorService存在吗?

最佳答案

听起来您真正想要的是 actors .简而言之,actor 是一个在单个线程中运行的对象,并具有一个任务“邮箱”,它负责按顺序处理这些任务。 Akka似乎是当前领先的库/框架,提供 JVM 上的参与者。去那边看看。

关于java - Java 是否提供一个 ExecutorService 允许一个 worker 在同一个线程上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15045182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com