2011-03-04 242 views
0

我知道這是如此manieth多線程線程。我已經閱讀了其中的很多。我已經閱讀了基本的線程教程。但沒有人回答我的問題,我有幾個問題。Java多線程unclarity

問題1:

當創建一個實現Runnable接口的類,我必須實現的run()方法。

如果我喜歡創建一個新的線程:

Thread t1 = new Thread(); 

它執行時調用start方法正確運行的方法?

現在我想讓我的線程t1在線程中執行另一個方法。

我面臨着以下情況:

tblGames = new JTable(new GamesTableModel(mainController.retrieveGames())); 

我認爲這是骯髒的編碼。 我認爲這將是更好的實例化一個列表變量,像這樣:

List<Game> games = mainController.retrieveGames(); 

現在是什麼情況,該GUI加載(使用JPA) 所以我想運行在另一個線程表內容時凍結。我正在使用GamesTableModel來處理JTable的列等,因此我在新的GamesTableModel的構造函數中傳遞一個List。

我在哪裏創建一個新線程,是否將它創建爲MainController類?如果是,則爲

(關於方法如下所示:)

public List<Game> retrieveGames(){ 
    List<Game> games = gameRepository.getGames(); 

    return games; 
} 

我將如何去運行的方法,或者在不同的線程整個方法的內容,實際上,它會很好是有整個MainController在一個新的線程,以便它永遠不會凍結用戶界面,或者這是不可取的?

如果建議,我是否需要在UI中創建一個線程?然後導致這個問題,我將如何運行

MainController mainController = new MainController(); 

在一個新的線程?

我從來沒有在程序中正確實現線程,因此我的newb問題。

我從界面的run方法主要關注的是,內容是否適用於實現類權限中的所有線程?

我需要單獨的線程來執行幾種不同的方法。

現在的主要問題是使用新線程填充JTable的內容以獲取內容。

對不起長時間乏味的閱讀。並感謝你仍然在這裏。

我希望收到一些關於我的問題的說明。

+0

'SwingWorker'可以幫助您解決所有問題。閱讀一些教程,這很簡單。 – 2011-03-04 09:03:54

+0

同意鮑里斯在SwingWorker上。之後,在實踐中給自己一份Java併發:http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ref=sr_1_1?ie=UTF8&s=books&qid=1283782299&sr=8- 1 – 2011-03-04 09:05:42

+0

感謝你們倆。 :)我現在讀關於它:) – 2011-03-04 09:47:18

回答

2

問題1:

當創建一個實現一類的Runnable接口,我不得不 執行Run()方法。

如果我喜歡創建一個新的線程:

線T1 =新的Thread();它在調用啓動 方法時執行 運行方法是否正確?

是的,這是正確的。 Runnable接口要求您實現run()方法,該方法在線程上執行start()時會自動執行。

我面臨着以下情況:

tblGames = new JTable(new GamesTableModel(mainController.retrieveGames())); 

我認爲這是骯髒的編碼。我想 倒不如來實例化一個 列表變量,像這樣:

這並不一定是討厭的編碼。如果你的意圖是,引用: I am using a GamesTableModel to handle the columns etc for the JTable, hence I pass a List in the constructer of new GamesTableModel 那麼這也是完全可以接受的,唯一的含義是你的代碼的可讀性。

我在哪裏可以創建一個新的線程,我 創建它的MainController類, 如果是這樣, 這是很難說的不知道你的MainController類實際上是做什麼的,但是從它的聲音,我可能會猜測是的。

我將如何去運行 內容的方法,或者在不同的線程整個 方法, 實際上,它會很好是在一個新的線程 整個MainController, 使之能永遠不要凍結用戶界面, 或者這是不可取的?

您可以定義一個新類,它實現Runnable並在需要時實例化該類的對象。接下來,在該類的構造函數中,您可以調用新實例的啓動。但是,在swing編程中,您可以使用SwingWorker線程執行資源密集型任務。如果你在EventDispatch線程中混合使用這種資源密集型邏輯,那麼你的UI肯定會凍結,我懷疑這是你的問題。

如果建議,我是否需要在UI中創建一個 線程?然後導致 的問題,我將如何運行

MainController mainController = new MainController();在一個新的線程?

您需要在SwingWorker線程中執行此操作。這裏是一個例子,說明如何用swing編程Source來做到這一點。下載並運行IconDemo項目。

我從接口的run方法 主要關注的是,內容 適用於 實現類權利的所有主題?

該類的實例的線程將具有相同的運行方法邏輯。但是,可以使用不同的運行方法創建另一個類的新線程。

總之,我強烈建議你理解擺動編程中SwingWorkers的概念。我有一種感覺,這個概念將幫助你解決你遇到的一些問題。

+0

非常感謝您花時間閱讀這些問題。我非常感謝你的回答。你把我的問題名稱合理化,事情變得清晰起來。我不認爲我可以要求更好的答案。謝謝。我現在要去挖掘更多的信息並下載Icon演示。如果沒有其他事情出現匹配這個至少,我會將這個線程標記爲您的帖子回答。 – 2011-03-04 09:25:23

+0

@Joey不客氣。切記要仔細研究我仔細提供的源代碼 - 我通過自己理解該示例開始了擺動編程。請注意,該示例中的資源密集型圖像加載由SwingWorker處理。 – 2011-03-04 09:36:04

+0

謝謝。我現在正在看它。這是非常有趣的代碼。只需一步一步閱讀,直到我完全理解它。線程並不是我發現的最簡單的主題。 :P但是再次感謝。你的答案是一個很好的答案。 – 2011-03-04 09:43:14

1

首先,在構造函數上運行長時間的數字運算通常是一個壞主意。所以,我首先拆分運算不同的方法,像這樣:

// Initialize 
MainController mainController = new MainController(); 
// Do the work 
mainController.doStuff(); 

然後你就可以運行在線程部分:

class MyThread extends Thread { 
    MainController mainController; 

    MyThread(MainController mainController) { 
     this.mainController = mainController; 
    } 

    public void run() { 
     mainController.doStuff(); 
    } 
} 

現在你可以在其他地方調用:

MainController mainController = new MainController(); 
MyThread myThread = new MyThread(mainController); 
myThread.start(); 
+0

我不太清楚我是否理解這一切。在這種情況下,我將如何在新線程中運行以下內容?列表 games = mainController.doStuff();我的MainController對象在UI始終處於活動狀態時需要保持活動狀態。我想,每當我需要一個控制器動作來執行時,不斷重新創建對象是令人討厭的。另外,我將如何去run()? mainController中會有10個方法,我認爲需要執行的方法不可行。 – 2011-03-04 09:21:53

+0

如果mainController需要在整個生命週期中保持活動狀態,那麼在它的構造函數中運行繁重的操作更糟糕的主意。 問題是如何在一個單獨的線程中運行某些東西;如何設計一個運行繁重處理的整個程序超出了這個範圍。關於線程,您的主要選項是爲每種類型的處理創建一個新的線程子類,或創建一個所有可處理項實現的接口,然後讓一個Thread子類將接口作爲參數並通過它調用處理代碼。 – Zds 2011-03-07 10:36:46