multithreading - Groovy 并发

标签 multithreading groovy

我对 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/

    相关文章:

    grails - Cobertura Grails代码覆盖率

    groovy - 如何制作 "StringWriterMarkupBuilder"

    java - 使用 Java 的 volatile 关键字的不一致

    c# - 在 C# 中构建流畅的动画

    c# - 使用 SharedMemory MMF 实现快速 .NET 无锁进程间

    objective-c - Cocoa:使用相同的委托(delegate)函数检查多个异步 NSURLConnections 是否需要?

    java - 与 Grails 类似的 Web 框架,但使用 Java 而不是 Groovy?

    testing - Groovy REST 端点测试替代方案

    math - 在 Groovy 除法中显示小数

    vb.net - 如何让一个线程等到另一个线程完成?