2011-06-15 97 views
2
Class Producer implements Runnable 
    Q q; 

    Producer(Q q) { 
     this.q = q; // line- 5 
     new Thread(this, "Producer").start(); 
    } 
    public void run(){ 
     int i = 0; 
     while(true){ 
     q.put(i++); 
     } 
    } 
} 

嘿,任何人都可以請告訴我: 1.在第5行,這是哪些q? 2.爲什麼在第6行沒有實例化對象?直接啓動函數被調用? 謝謝...線程通信程序

+0

這很可能是殺死你的系統的好方法。根據實現方式的不同,q.put()可能會爲每次調用創建一個或兩個對象,從而導致GC線程達到最大值。默認行爲是使用系統上的所有內核來執行此操作。除非你有非常快的消費者,否則你很可能會耗盡內存,這至少會阻止製片人。在main()函數中,新生產者(q)(其中q是Q的一個對象)中的 – 2011-06-15 09:33:29

回答

0

5號線 - q實例變量設置爲傳遞給生產者構造函數的q值。

Line 6 - 一個新的線程被實例化。它從構造函數返回,並立即調用start方法。

+0

被寫入。現在我的問題是,this.q和q有什麼區別?這用於引用調用者?但是這裏沒有任何對象調用這個構造函數 – 2011-06-15 09:29:49

+0

關鍵字this指的是當前的Object實例 - 所以它指的是實例變量,即「Q q;」 – planetjones 2011-06-15 09:31:07

+0

Then calling new Producer(q); 將與 完全一樣生產者re = new Producer(q); 如果是這樣,那麼第二種方法是有用的? – 2011-06-15 09:44:01

0
  • this.q是在第2行
  • 平原q聲明的實例變量q在管線中聲明的構造符參數4
  • 在第6行中,對象經由new實例化,則start方法是立即呼籲它。沒有任何明確提及保存的對象。但是,由於它用於啓動線程,因此它將在該線程中隱式引用,因此在線程完成之前不會變爲垃圾收集的條件。
+0

謝謝,這是最有幫助 – 2011-06-15 09:33:57

+0

然後 致電 新制片人(q); 將與 完全一樣生產者re = new Producer(q); 如果是這樣,那麼第二種方法是有用的? – 2011-06-15 09:42:31

+0

@Abhay:第二種方式保持對對象的引用're',以便您可以調用它的方法或將它作爲參數傳遞給它。大多數物體沒有參考就沒用了。 – 2011-06-15 10:28:13

0

在第5行,類private(this。)q通過在構造函數中傳遞的q實例化。

在第6行創建了一個新的線程,但該對象從不再使用,所以這只是一個簡短的方法。

Thread t = new Thread(this,"Producer"); 
    t.start(); 

是相當於

new Thread(this,"Producer").start(); 
+0

Then calling new Producer(q); 將與 完全一樣生產者re = new Producer(q); 如果是這樣,那麼第二種方法是有用的? – 2011-06-15 09:43:21

+0

新制片人(q)只是製作人。在這種情況下,你不能在任何後面的代碼中使用該對象。如果你不需要它,這很好。如果你稍後需要這個對象(在你的情況'重新'),你會用第二種方式! – 2011-06-15 10:25:04

0
  1. 在聲明this.q = q;this.q指類的實例的q領域,而q指參數。
  2. new Thread(this, "Producer")創建Thread類的新實例,所以是的,在調用start()方法之前實例化對象。
0

在第5行,this.q指的是當前構造的Producer對象的字段q。第二個q引用構造函數參數,即已傳遞給構造者的Q

在第6行,有一個新的Thread對象構造。它只是沒有分配給任何變量。而是直接調用start()方法。當不需要提及Thread對象時,這是一種常見模式。

可以與此相當的代碼替換它:

Thread thread = new Thread(this, "Producer"); 
thread.start(); 

這將有完全相同的效果。

+0

好的謝謝,剛剛確認 – 2011-06-15 09:33:45

+0

然後 打電話 新制片人(q); 將與 完全一樣生產者re = new Producer(q); 如果是這樣,那麼第二種方法是有用的? – 2011-06-15 09:45:32

+0

@Abhay:第二種方式是比較常見的方法,因爲*通常*一個對象實際上不會*做任何事情,除非您調用它的方法。這意味着你通常想要在變量中保留對它的引用。 'Thread'在這裏略有不同:一旦你調用'start()',它就會自行運行。你*只需要堅持下去,如果你以後需要檢查它的狀態或類似的東西。 – 2011-06-15 10:22:35