2017-04-20 27 views
0
t=new Thread(this,"clocky"); 
t.start(); 

這是創建一個新線程的方式,但我不明白爲什麼會使用它。「this」在java中的多線程中意味着什麼?

+5

糾錯:這是** a **創建新線程的方式。有關更多詳細信息,請參閱[定義和啓動線程](https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html)。 – shmosel

回答

1

表示您正在使用當前對象run()的方法,從Runnable接口,作爲此線程的主/啓動方法。

4

讓我們開始看java文檔。你實際上是在調用此構造

public Thread(Runnable target, String name)

java doc

目標 - 其run方法時,該線程 啓動被調用的對象。如果爲null,則調用此線程的運行方法。

- 新線程

這裏this的名稱,是指你在哪裏調用它的類的當前對象,因爲它是在java中的其他地方。我相信你的那個類實現Runnable並重寫run()方法。那就是構造函數參數如何匹配。

+1

最後一個單詞的輕微錯字:*匹配*。 –

+0

ow。是。謝謝。糾正。 –

+0

順便說一句,非常好的答案,upvoted! ;-) –

0

看一看

Multithread Basics

簡單示例

public class Test { 

public static void main(String[] args) throws ParseException { 


    Thread threadOne = new Thread(new Class_1(),"Class_1"); 
    Thread threadTwo = new Thread(new Class_2(), "Class_2"); 


    threadOne.run(); //This run calls run in Class_1 
    threadTwo.run(); //This run calls run in Class_2 


} 

} 

class Class_1 implements Runnable{ 
@Override 
public void run() { 
    System.out.println("Class_1 run method"); 
} 
} 

class Class_2 implements Runnable{ 
@Override 
public void run() { 
    System.out.println("Class_2 run method"); 
} 
} 

輸出

Class_1 run method 
Class_2 run method 
0

您必須在當前類中實現可運行接口,並通過在您的類的構造函數中使用關鍵字傳遞當前可運行對象來初始化線程。

它必須調用運行方法,同時創建可運行類的實例,如下面的示例。

public class Nool implements Runnable { 

    Thread t; 

    public Nool() { 
     t = new Thread(this, "Nool"); 
     t.start(); 
    } 

    @Override 
    public void run() { 
     System.out.println("NOOL"); 
    } 

} 

我希望這個解釋對你有幫助。

+0

除了這是一個_Really Bad Idea_在給定線程對象的構造函數返回之前引用某個對象。 (也就是說,在對象被[_safely published_](https://www.ibm.com/developerworks/library/j-jtp0618/)) –

+0

@jameslarge之前,我無法理解你想要解釋什麼。 – vijayraj34

+0

'Nool'類的構造函數將'this'賦予一個新的線程。 'this'是對構造函數尚未完成構造的對象的引用。這很糟糕,因爲新線程啓動時線程之間沒有同步。如果沒有同步,則不能保證一個線程何時(如果曾經)看到不同線程所做的更改。即使'thread.start()'是你的構造函數所做的最後一件事情,新線程可能會看到處於未構造狀態的對象。 –