2010-08-09 85 views
7

當我將下面的代碼放在NetBeans中時,NetBeans在旁邊給我一個警告,提示「訪問靜態方法睡眠」。Java - 訪問靜態方法睡眠 - 出現了什麼問題?

 try { 
      Thread.currentThread().sleep(2000); 
     } 
     catch(InterruptedException ie){ 
      //continue 
     } 

我做錯了什麼?我應該以不同的方式調用嗎?我沒有做任何事情多線程。我只是有一個簡單的主要方法,我想睡一會兒。

+2

附註:從Java 5開始,有一個TimeUnits,您可以調用這些睡眠,在我看來,可讀性更強。例如。 'TimeUnit.SECONDS.sleep(2);' – 2010-10-01 11:42:45

回答

10

Thread.currentThread()返回Thread類的一個實例。當調用一個靜態方法時,你只需要處理類本身。因此,在當前線程中調用一個靜態方法時,您將得到一個警告,您正在調用實例上的方法。

你只需調用Thread.sleep(2000);這將相當於Thread.currentThread.sleep(2000);

這是很重要的知道,因爲人已經被燒燬做這樣的事情:

Thread a = new Thread(someRunnable); 

a.start(); 
a.sleep(2000); //this will sleep the current thread NOT a. 

編輯:那麼,如何才能睡?您可以通過內部的可運行在傳遞給構造函數,就像寫睡眠調用睡:

Runnable someRunnable = new Runnable(){ 
    public void run(){ 
     Thread.sleep(2000); 
    } 
}; 

當「a」開始,Thread.currentThread在someRunnable的run方法是「一」線程實例。

+0

那麼你怎麼睡一個? – Greg 2010-08-09 13:28:34

+3

@Greg,你不'睡',你發送一條消息到'一',它需要去睡覺。一種方法是讓'run'尋找一個被設置的變量,如果變量被設置,它就會進入休眠狀態,並且一個外部調用者可以用來設置該變量的'a'方法。 – 2010-08-09 14:35:56

6

sleep是靜態的,所以您可以使用Thread.sleep(2000);來訪問它。它影響當前線程。

根據JavaDoc:

使當前執行的線程 休眠(暫停執行) 用於 毫秒指定的數。線程不會丟失任何監視器的所有權。

這是什麼意思是,你不能睡另一線程,只有一個代碼是英寸

2

那是因爲睡眠()方法被聲明爲static因此

Thread.currentThread().sleep(2000); 

Thread.sleep(2000); 
1

netbeans給你警告,因爲你正在從線程引用而不是線程類訪問靜態方法。 試試這個

try { 
      Thread.sleep(2000); 
     } 
     catch(InterruptedException ie){ 
      //continue 
     } 

睡眠方法使當前執行的線程sleep.So不需要調用Thread.currentThread()。

1

每當你嘗試使用對象它不是最好的做法,NB給人當時警告訪問靜態方法,這裏是相同的情況下

Thread.currentThread()將返回線程的對象

2

線程實例上沒有對應於「sleep(long)」的方法。

Thread.currentThread()。sleep(2000);但是,因爲在線程類中有一個方法被稱爲sleep()並且參數很長。

Java允許將其作爲編譯器時間技巧,以便新編碼人員在對方法的靜態訪問感到困惑時可以執行此操作。

但是,什麼這實際上是在編譯器解決的是:

了Thread.sleep(2000);

下面的代碼也相當於:

線程t =新主題(新的Runnable(){公共無效的run(){//什麼也不做}}); t.sleep(2000);作爲一個海報(John V)指出,這不會使實際線程(t)實例處於休眠狀態 - 創建線程對象的當前線程將進入睡眠狀態。

警告的存在使您記住您正在訪問類的靜態方法,而不是實例變量的方法。

要編寫的適當代碼總是Thread.sleep(2000); - 從不通過實例訪問靜態方法以避免混淆和此警告。