почему этот параметр имени scala ведет себя странно - PullRequest
3 голосов
/ 28 октября 2010

Хорошо, вопрос может не сказать много, но вот сделка: Я изучаю 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 есть библиотека актеров, но я хотел попробовать это, так как всегда хотел сделать это на Java

Ответы [ 2 ]

7 голосов
/ 28 октября 2010

Это просто состояние гонки?runInThread запускает поток, но ваше утверждение проверяется «выполненным» до того, как другой поток устанавливает его в значение true.Добавление дополнительной строки означает, что перед тестом выполняется больше кода (и, следовательно, времени), что повышает вероятность того, что для параметра «execute» установлено значение true

4 голосов
/ 29 октября 2010

Стоит также отметить, что (в Scala 2.8) конструкция, которую вы пытались написать, доступна в стандартной библиотеке

import scala.actors.Futures._

future{
    executed = true
}

Эта конструкция на самом деле более мощная, чем то, что вы описываете,вычисление потока может вернуть значение, которое можно ожидать.

import scala.actors.Futures._

//forks off expensive calculation
val expensiveToCalculateNumber:Future[Int] = future{
    bigExpensiveCalculation()  
}

// do a lot of other stuff

//print out the result of the expensive calculation if it's ready, otherwise wait until it is
println( expensiveToCalculateNumber());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...