gpt4 book ai didi

java - 让它漂亮 : processing an array concurrently

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:18:57 25 4
gpt4 key购买 nike

我想将这个线性循环转换为并发循环:

for(Item item : ItemList) {
processItem(item);
}

这真的是最短的方法吗?

class Worker implements Runnable {
Item item;
Worker(Item item) {
this.item = item;
}
public void Run() {
processItem(item);
}
}

ExecutorService exec = Executors.newFixedThreadPool(THREADPOOL_SIZE);
for(Item item : ItemList) {
exec.execute(new Worker(item));
}
exec.shutdown();

boolean properFinish = false;
try {
properFinish = exec.awaitTermination(50, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}

具体来说,我想要一种使用匿名类的方法,但实际上,如果有任何方法可以使这个更短、更易读,我们将不胜感激。

更新:刚刚意识到我有点愚蠢,因为在这个例子中使用匿名类非常容易:

for(final Item item : ItemList) {
exec.execute(new Runnable() {
public void run() {
processItem(item);
}
});
}

在我的原始代码中,循环很简单 for (i=0; i<=ItemList.length(); i++)而且我想不出一种方法让 i 以任何有意义的方式结束。我想使用“for each”循环会使情况变得更好。

还有什么方法可以摆脱其余的样板文件?

更新 2:使用 ExecutorCompletionService ,假设 processItem返回结果。

ExecutorService exec = Executors.newFixedThreadPool(THREADPOOL_SIZE);
CompletionService<ResultType> ecs = new ExecutorCompletionService<ResultType>(executor);
for(final Item item : ItemList) {
ecs.submit(new Callable<ResultType>() {
public ResultType call() {
return processItem(item);
}
});
}

for(Item item : item) {
// Do whatever with the results
ecs.take().get();
}

这确实看起来更好。

最佳答案

检查 JDK 6 中的 ExecutorCompletionService - 而不是旋转您自己的。它允许您为分配的任务执行多个线程,并在处理每个线程时获取每个线程的结果。

关于java - 让它漂亮 : processing an array concurrently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/914346/

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