2012-01-16 22 views
6

我有一個關於Java中6行爲Java的ScheduledExecutorService.scheduleAtFixedRate()的

上ScheduledExecutorService的該scheduleAtFixedRate()方法的問題[編輯:1.6的Javadoc比1.5更完整。下面參見注釋]

鑑於:

  • 的ScheduledExecutorService的是在游泳池
  • 固定速率構造具有N = 1級的線程是一個週期的T秒
  • 沒有初始延遲

在這種情況下會發生什麼(時間不是絕對的,在實時意義上):

  • 在時間T,服務揭開序幕一個Runnable任務,「任務1」
  • 在時間2T,TASK1尚未完成,服務計劃解僱

保證做任何服務以下的?

  • (a)中在2T,開球一個Runnable任務, 「TASK2」(召回N = 1)
  • (b)中的塊,直到任務1完成
  • (C)跳過此時間並再次嘗試在3T
  • (d)的行爲是未定義

或者其他什麼東西?如果N> 1,答案會改變嗎?

+0

我在看Java 1.5 doc(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate%28java.lang.Runnable, %20long,%20long,%20java.util.concurrent.TimeUnit%29),它沒有答案。在寫這個問題的時候,我沒有仔細查看1.6鏈接。正如你所看到的,1.6的答案很明顯。 – 2012-01-17 00:56:57

回答

6

答案是

(B)塊,直至任務1完成

,那就是不管執行的線程數(TASK2甚至可以不提交)。

的醫生說:

如果該任務的任一執行時間比其週期長,則後續執行可能起步晚,但不會同時執行

(順便說一句,因爲沒有INTIAL延遲, 「TASK1」 開球會馬上爲doc`ed:

執行將開始在initialDelay

)。

1

從你鏈接的文檔...

如果該任務的任一執行時間比其週期長,則後續執行可能起步晚,但不會同時執行。