好吧,这个问题可能没什么好说的,但这是交易:
我正在学习 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/