0

这是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
  }   
}
4

2 回答 2

6

首先,如果您在 Windows 上运行,您应该知道计时器分辨率约为 15.6 毫秒。

其次,您的 1M 迭代的空循环很可能会被编译器删除,更重要的是,不能被任何超时中断。

于 2010-09-29T05:48:19.023 回答
0

线程休眠的工作方式是线程要求操作系统在给定时间后中断它。这就是 result.get 调用中超时的工作方式。现在,您依靠执行此操作的操作系统线程在您的超时到期的确切时间运行,当然它可能不是。还有一个事实是你有 10000 个线程要中断,它不能同时做所有事情。

于 2012-06-10T17:08:22.100 回答