scala - 为什么这个 Scala by-name 参数的行为很奇怪

标签 scala

好吧,这个问题可能没什么好说的,但这是交易:
我正在学习 scala 并决定使用一个方法来创建一个实用程序类“FuncThread”,该方法接收一个按名称的参数函数(我猜它是这样调用的,因为它是一个函数但没有参数列表)然后启动一个带有可运行的线程依次执行传递的函数,我写了这样一个类,如下所示:

class FuncThread
{
   def runInThread( func: => Unit)
   {
     val thread = new Thread(new Runnable()
     {
        def run()
        {
          func
        }
     }

     thread.start()
   }
}

然后我写了一个junit测试如下:
@Test
def weirdBehaivorTest()
{
  var executed = false
  val util = new FuncThread()
  util.runInThread
  {
    executed = true
  }

  //the next line makes the test pass....
  //val nonSense : () => Unit  = () => { Console println "???" }

  assertTrue(executed)
}

如果我取消注释第二条注释行,则测试通过,但如果它仍然被注释,则测试失败,这是正确的行为吗?如何以及何时执行按名称参数函数?

我知道 Scala 有 actor 库,但我想尝试一下,因为我一直想在 Java 中做到这一点

最佳答案

这只是一个竞争条件吗? runInThread 启动线程,但您的断言测试在另一个线程将其设置为 true 之前“执行”。添加额外的行意味着在测试之前执行更多代码(以及时间),从而更有可能将 'executed' 设置为 true

关于scala - 为什么这个 Scala by-name 参数的行为很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4044165/

相关文章:

scala - 使用 SQLContext 隐式在 Spark 中进行单元测试

mongodb - 使用 scala mongo 驱动程序序列化为对象?

mongodb - 从 BsonString 中提取字符串值

scala - 构造 Jooq 流太慢

mongodb - 使用 mongo-scala-driver 在 Scala 中打印来自 Mongodb 的查询结果

Scalaz ·克莱斯利问题

scala - 如何过滤由左连接生成的可选表

multithreading - 嵌套 future 导致更差的性能

scala - 线程 "main"java.lang.NoClassDefFoundError : org/apache/spark/streaming/StreamingContext 中的异常

scala - 在 Scala 中使用 for comprehension