2010-09-24 104 views
4

我很困惑(新的java):Java接口問題

當實現Runnable接口時,必須重寫run()方法來獲得線程執行能力。實現這個接口使你的對象成爲Runnable(?)類型。線程功能如何通過簡單地實現Runnable接口來「注入」?基本上,當你實例化一個實現Runnable的類時,在線程化功能中發生了什麼?我可能誤解了一些基於OO的概念。謝謝。

是否知道在執行thread.start()時查找可運行的JVM?

回答

9

當您創建Runnable的實現時,沒有什麼將您的類綁定到JVM的線程容量。 Runnable接口的一個實例就像任何其他接口的實例,只是另一個實例。

如果要使用JVM的線程系統,則必須使用Thread類的新實例,該實例將在單獨的線程中運行Runnable實現的run()方法。

有關創建新線程的所有邏輯都由Thread類完成。

+3

啊,它是。關鍵是Thread類的構造函數需要一個Runnable參數。謝謝! – ikp 2010-09-24 19:37:38

+0

@ikp,如果這個答案對你有幫助,你可以驗證它。 (在支票票數下的支票) – 2010-09-24 19:41:28

+0

我會......當系統讓我:) – ikp 2010-09-24 19:42:08

4

Runnable表示「可以」在單獨的線程中運行或不運行的工作(您可以自己調用Runnable.run())。

但是調用了Runnable在一個單獨的線程,然後像做

Thread thread = new Thread(new MyRunnable()); 
thread.start(); // MyRunnable will now be invoked in a new thread 
2

沒什麼特別是在後臺真的發生了。

實施Runnable接口可確保您的班級擁有public void run()方法。

當你將自定義類傳遞給Thread時,真的會發生這種魔法。

Thread th = new Thread(new YourCustomRunnable()); 
th.start(); 

在上面的代碼中,新Thread將被創建,並且run()方法中的代碼將在另一個線程運行。

內部線程會調用您的自定義run()方法並使該代碼在單獨的線程上運行。這在技術上是可以做到以下幾點:

Runnable r = new MyCustomRunnable(); 
r.run(); 

在上面的代碼,r將不是一個單獨的線程上運行。

1

接口是一種契約。通過實現Runnable,您承諾您將提供界面中定義的所有方法。因此,任何知道Runnable.run()的「Thread」的其他類都可以在您的類的對象上調用此方法。即使不知道你的課程。

爲了開始你的代碼一個新的線程,你需要寫這樣的事:

Thread thread = new Thread(new MyRunnable()); 
thread.start(); 

的start()方法會做一些操作系統魔術以產生線程,然後調用在您作爲參數提供給構造函數的對象上的該操作系統線程上下文中的run()方法。

2

實現Runnable不會啓動一個新線程,要啓動一個新線程,您需要創建一個新線程對象並啓動它,並且最常用的線程構造函數之一將Runnable作爲參數(Thread(Runnable)):

Thread t = new Thread(new MyRunnable()); 
t.start(); 
1

根據最近的定義(春季/ DI)沒有「注射」。 Runnable與其他任何接口沒有區別。這是一個「契約」,它說明你的類提供了在界面中調用的任何必要的方法。

+0

您可以將它看作構造函數將Runnable插入到線程中。除了提供依賴關係的代碼外,沒有DI引擎。 – duffymo 2010-09-24 19:41:24

+0

我想,儘管在我看來,這就是將注射定義擴展到極限...... :) – chrismh 2010-09-24 19:57:29

2

實現Runnable不會奇蹟般地讓你的類在一個線程上運行。相反,您可以這樣做:

Runnable myRunnable = new MyRunnable(); // MyRunnable implements Runnable 
Thread t = new Thread(myRunnable); 
t.start(); 

現在,您的代碼在myRunnable的run()方法中將在單獨的線程中執行。我強烈建議您查看java.util.concurrent包中的ExecutorService和Executors。這些對象將執行您在線程中傳遞的內容(Runnable)。使用Executor/ExecutorService的優點是可以預定義要分配的線程數量,並採用各種策略來增長/縮小或保持常量。

新手感興趣的另一件事:線程可以是守護進程(後臺)或非守護進程(如UI)線程。如果有非守護進程線程在運行,那麼您的JVM不會死亡。要聲明一個線程爲守護進程,只需調用setDaemon()。使用執行程序時,您需要提供一個ThreadFactory,其中創建線程並將其標記爲守護進程。

希望這會有所幫助。