2010-01-16 90 views
68

我有這個在我的代碼的Java:Thread.currentThread()睡眠(X)與了Thread.sleep(x)的

Thread.currentThread().sleep(x); 

Eclipse的告訴我使用靜態

Thread.sleep(x); 

相反,爲什麼?有什麼區別,這兩種方法在功能上有差異嗎?

+1

在Eclipse中有一個'Save Action',它將自動替換靜態成員通過實例變量訪問,並通過類名進行靜態訪問 - 啓用此Save Action以及其他許多Save Actions(如同意)(例如,刪除不必要的演員,不必要的「這個」等)。 – les2 2010-01-17 05:37:32

回答

119

只有一個方法,而不是兩個,它是靜態的。雖然您可以通過實例引用調用靜態方法,但它不是很好的風格。它表示程序員認爲他或她正在調用實例方法。一個困惑的程序員可能會認爲他或她可能會導致另一個線程(而不是當前線程)以這種方式睡覺,但這不是它的作用。

你的代碼行都做同樣的事情,但第二個是更好的風格。

+21

+1提到程序員可能想通過someThread.sleep()來調用某個特定的線程,但它不會。 – Chii 2010-01-16 14:40:39

27

在Java中,睡眠是一種靜態方法。你的兩個例子都做同樣的事情,但前一個版本很混亂,因爲它看起來像是在一個特定的對象上調用一個方法,但它根本沒有這樣做。在你的榜樣,將沒有多大關係,但更危險的,如果你具備以下條件:

someOtherThread.sleep(x); 

這一次,它看起來你是在告訴其他線程睡眠,但實際上你是把當前線程睡覺。避免產生這種類型錯誤的方法是始終使用類而不是特定對象調用靜態方法。因爲它們調用相同的方法,但使用類名(主題在這種情況下),而不是實例訪問靜態字段和方法使得這種靜態性明確

+0

你的意思是currentThread和someOtherThread會在執行這條單線時進入睡眠狀態「someOtherThread.sleep(x);」 ?? – 2013-03-20 14:40:59

+2

不需要。不管調用什麼Thread對象.sleep,當前線程都會進入休眠狀態。你不能讓其他線程進入睡眠狀態(就像那樣)。 – Torque 2013-03-29 23:14:58

3

兩個方法調用在行爲上是相同的。這就是產生這個警告的原因。

但是考慮到在大多數IDE中以特定方式顯示靜態字段和方法(例如,在Eclipse和IntelliJ IDEA中以斜體字體顯示),此警告是否仍然有必要?也許並不像Java早期那麼簡單的編輯器正在使用那麼必要。

0

Thread.currentThread().sleep(x);或方式Eclipse的說,如果它是需要這樣Thread.sleep(x);靜態上下文是必需的,所以我們堅持用這種睡眠稍有延遲。

由一個對象設置的靜態範例隻影響特定對象堆的打印生命週期,再次考慮整個對象生命週期靜態不是那麼麻煩,如果需要它可以用於緩解編碼,但要小心完成因爲靜態腳印是由Class(例如: - Class.forName(pkg.className))按名稱引用而不是由object引用,它是在HEAP內存中的Class運行時單個打印副本。對象的

再次使用也有優點缺點&弱,幻影,強種參考文獻......,

代碼本質上是令人費解的。這只是我們如何才能使其工作&功能。

+1

**要談論線程, - 它會異步產生,雖然我們可能在線程中有同步的東西。就本質而言,所有事物都是異步的,儘管我們發現某些事物是同步的。即使我們侵入量子或天文學,也沒有任何事物是同步的。** – 2015-12-03 06:23:31