Исполнители работают дольше, чем значение тайм-аута - PullRequest
0 голосов
/ 29 сентября 2010

Вот сегмент кода scala.Я установил таймаут как 100 мельниц.Из 10000 петель в 106 из них работают более 100 мельниц без исключений.Самый большой из них - 135 мельниц.Любая причина, почему это происходит?

for (j <- 0 to 10000) {
  total += 1
  val executor = Executors.newSingleThreadExecutor
  val result = executor.submit[Int](new Callable[Int] {
      def call = try {
        Thread.sleep(95)
        for (i <- 0 to 1000000) {}
        4   
      } catch {
        case e: Exception => exception1 += 1
        5   
      }   
  })  

  try {
    val t1 = Calendar.getInstance.getTimeInMillis
    result.get(100, TimeUnit.MILLISECONDS)
    val t2 = Calendar.getInstance.getTimeInMillis
    println("timediff = " + (t2 - t1).toString)
  } catch {
    case e: Exception => exception2 += 1
  }   
}

Ответы [ 2 ]

6 голосов
/ 29 сентября 2010

Во-первых, если вы работаете в Windows, вы должны знать, что разрешение таймера составляет около 15,6 миллисекунд.

Во-вторых, ваш пустой цикл из 1M итераций, скорее всего, будет удален компилятором, и, что более важно, не может быть прерван ни одним таймаутом.

0 голосов
/ 10 июня 2012

Способ ожидания потока работает так, что поток просит o / s прервать его по истечении заданного времени.Вот как работает тайм-аут в вызове result.get.Теперь вы полагаетесь на поток ОС, который делает это, чтобы он работал в то время, когда истекло время ожидания, что, конечно, может не быть.Тогда есть факт, что у вас есть 10000 потоков для прерывания, что он не может сделать все одновременно.

...