2012-03-08 19 views
0

我想在一個類下編寫多個線程,並找到了一種方法。此threadExample如何工作?

public class ThreadExample { 

    public static void main(String[] arg) 
    { 

     Thread one = new Thread() { 
      public void run() { 
       try { 
        Thread.sleep(2000); 
       } catch(InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("One"); 
      } 
     }; 

     Thread two = new Thread() { 
      public void run() { 
       System.out.println("Two"); 
      } 
     }; 

     one.start(); 
     two.start();  
    } 
} 

事情我不明白這裏,我既不擴展Thread類我也沒有實現Runnable接口。我如何理解這一點? 如果答案是,「我只是創造了Thread類的對象,並使用它,那麼爲什麼不總是這樣做,而不是做以上?

回答

2

技術上提到的東西,你在做什麼延長。Thread你是在擴展它的東西飛稱爲匿名內部類 - 更多地瞭解那是什麼,開始here和閱讀此頁加上未來兩個

這意味着什麼是你正在創建臨時內嵌子沒有名稱,並且其定義只能在方法結束之前才能存活。爲什麼要這樣做而不是創建一個名爲的子類還是Runnable的執行?當run()正文與上面的示例一樣簡單時,它就很有意義 - 這樣可以減少打字次數,減少跟蹤文件的次數。諸如此類的一次性簡單任務適用於Thread的匿名內部類擴展。對於主要的程序邏輯,您可能希望在單獨的文件中執行完整的命名類實現。

此外,一旦您獲得了Thread的良好體驗,我鼓勵您查看java.util.concurrent包。

2

啊,但你延長Thread類...匿名。

使用new Class() {}語法時,您將創建一個anonymous class,它是指定類的子類(即實際爲extends)。

在這種情況下,您已覆蓋Thread.run()方法。

這種方法雖然有效,但它不被認爲是「好的設計」,因爲您正在擴展線程,但您並未創建新的線程。最好是一個Runnable傳入構造:

new Thread(new Runnable() { 
    public void run() { 
     // do something 
    } 
}).start(); 
+0

該信息真棒!謝謝 – noMAD 2012-03-08 05:48:52

1

波希米亞回答了你的第一個問題,所以我會回答你的第二個:「我只是創建Thread類的對象,並使用它,那麼爲什麼不總是這樣做,而不是做上面提到的事情?「

如果您始終按照您在問題中所做的方式進行操作,那麼您無法將執行任務的邏輯與執行任務的方式分開。通過實施runnable,您可以將執行任務的邏輯與管理任務運行方式的代碼分開捆綁。

如果您使用runnables,您可以在新線程中運行您的任務,請在調用線程中運行您的任務,延遲運行任務或以其他方式運行它,而不修改runnable中的代碼。

使用線程時,通常要使用ExecutorService而不是直接使用線程類。Executor服務提供了限制線程數量,處理失敗執行,確定runnable何時完成,從其他線程中運行的任務獲取返回值等的工具。

+0

謝謝你! :) 明白這點。 – noMAD 2012-03-08 05:47:55