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

スレッドスリープが機能する方法は、スレッドが o/s に、指定された時間後にスレッドを中断するように要求することです。これが、result.get 呼び出しでタイムアウトが機能する方法です。これを実行する OS スレッドが、タイムアウトの期限が切れた正確な時間に実行されていることに依存していますが、もちろんそうではない場合もあります。次に、中断するスレッドが10000あるという事実がありますが、すべてを同時に実行することはできません。

于 2012-06-10T17:08:22.100 に答える