gpt4 book ai didi

multithreading - Groovy 并发

转载 作者:行者123 更新时间:2023-12-04 06:50:26 25 4
gpt4 key购买 nike

我对 Groovy 线程有疑问。

我的任务是以某种方式翻译给定目录中的每个文件
并将生成的输出放在其他目录中的文件中。

我编写了以下代码,该代码有效:

static def translateDir(fromDir, targetDir) {
def allFiles = new File(fromDir).listFiles()
def numFiles = allFiles.length

for (i in 0..(numFiles - 1))
translate(allFiles[i].getAbsolutePath(), targetDir)
}

现在,我尝试像这样并行化这段代码:
static def translateDir(fromDir, targetDir) {
def allFiles = new File(fromDir).listFiles()
def numFiles = allFiles.length
def numCores = Runtime.getRuntime().availableProcessors()

for (i in 0..(numCores - 1)) {
println("Thread " + i + "starting")
Thread.start {
for (def j = i; j < numFiles; j += numCores) {
println("j = " + j)
translate(allFiles[j].getAbsolutePath(), targetDir)
}
}
}
}

这不起作用并提供输出:
Thread 0 starting
Thread 1 starting
Thread 2 starting
Thread 3 starting

在我的测试用例中,nunCores 是 4,numFiles 是 3。
这里发生了什么?

最佳答案

好的,有两件事:

  • 在线程的隐式 run() 方法中,您正在引用“i”变量。我必须通过调试器逐步了解会发生什么,但从技术上讲,你甚至不应该在那里访问“i”,因为它不是最终的。因此,我建议创建一个 Runnable 对象,在构造函数中将“i”传递给该对象。然后在线程上启动runnable。
  • Groovy 有很好的并发支持——没有理由像这样滚动你自己的。看看GPars
  • 关于multithreading - Groovy 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10790813/

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