2012-04-17 67 views
2

我,爲什麼下面投不工作極其混亂:創建的ScheduledThreadPoolExecutor使用Executors

ScheduledThreadPoolExecutor timeoutControl = (ScheduledThreadPoolExecutor) Executors.newSingleThreadScheduledExecutor(); 

的ScheduledThreadPoolExecutor實現了ScheduledExecutorService的。如果我不能將它與實際的類一起使用,這個Executors調用的重點是什麼。

我用錯了(可能),有人可以提供一些指導嗎?

回答

4

問題是Executors.newSingleThreadScheduledExecutor();實際上並沒有返回ScheduledThreadPoolExecutor

Source codeExecutors類:

public static ScheduledExecutorService newSingleThreadScheduledExecutor() { 
     return new DelegatedScheduledExecutorService 
      (new ScheduledThreadPoolExecutor(1)); 
} 

Delegated...類(有一個DelegatedExecutorService太)只是過客所有調用底層的執行者,在ScheduledThreadPoolExecutor在這種情況下。代碼中的註釋表明這些類的全部要點是隱藏底層執行程序可能具有的所有非接口方法。

在任何情況下,它是更好的做法無論如何要使用的接口,而不是你正在工作(List而不是ArrayListScheduledExecutorService而不是ScheduledThreadPoolExecutor)的對象的類版本。

如果您絕對需要ScheduledThreadPoolExecutor中的功能而不是ScheduledExecutorService,則可以使用ScheduledThreadPoolExecutor的構造函數創建它的一個實例。

+0

太棒了,我看到我以錯誤的方式去做,謝謝!經過一番思考,我明白了爲什麼。 – Constantin 2012-04-17 22:56:51

4

您應該只使用返回的執行程序作爲ScheduledExecutorService,而不是將其轉換爲ScheduledThreadPoolExecutor

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
+0

現在我想到了,這是有道理的。謝謝。 – Constantin 2012-04-17 22:57:19

1

爲了簡化:

實現接口的類可能有接口沒有的其他方法和字段。在這種情況下,該方法會返回接口,因此您無法將其下載到實現類中。