2014-01-22 58 views
0

在對多線程做一些實踐的時候,我發現我不能在我的代碼中設置線程的名字。我可以使用this來引用當前對象,那麼爲什麼我在構造線程來訪問當前線程時無法使用Thread.currentThread。我有點困惑。請幫幫我。在構造函數中的「this」對象和CurrentThread之間

實際創建線程時?是在構建線程實例時還是在線程上調用方法start()時?

currentThread是什麼意思?

public class RecursiveRunnableTest { 

    public static void main(String... args){ 
     Thread t = new Thread(new RecursiveRunnable("First thread")); 
     t.start(); 
    } 


} 

class RecursiveRunnable implements Runnable { 

    private String name; 
    public RecursiveRunnable(String name) { 
     this.name = name; 
     Thread.currentThread().setName(this.name); // Expecting to set the name of thread here 
    } 
    @Override 
    public synchronized void run() { 
     System.out.println(Thread.currentThread().getName()); // displaying Thread-0 
     System.out.println(this.name); // displaying "First thread" 

     try{ 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     }finally{ 

     } 
    } 
} 
+1

'this',在你的代碼,是RecursiveRunnable的實例,而不是線程 –

+0

順便說一句,不申報'run'方法爲'synchronized'。在最好的情況下,它將被淘汰。但在更復雜的代碼中執行此操作時,您可能會得到令人驚訝的結果。 – Holger

+0

@Holger,我實際上在玩多線程。我發現這種差異。 – CHowdappaM

回答

1

嘗試做這個,而不是

Thread t = new Thread(new RecursiveRunnable("First thread")); 
t.start(); 
Thread.sleep(1L); 
System.out.println("main thread: " + Thread.currentThread().getName()); // same thread that created the RecrusiveRunnable instance 

你會看到

main thread: First thread 

打印。 這是因爲主線程構建RecursiveRunnable,所以

Thread.currentThread().setName(this.name); 

實際上是改變了主線程的名稱,而不是線程的Runnable最終會運行。


而且

System.out.println(this.name); // displaying "First thread" 

指的是RecursiveRunnable對象的name字段,它你已經設置爲與主線程相同的值。

2

只是因爲主線程構造它不是t線程構造自己。所以,你可以重寫這一個(開始前設置線程的名稱):

public class RecursiveRunnableTest { 

    public static void main(String... args){ 
     RecursiveRunnable rr = new RecursiveRunnable("First thread"); 
     Thread t = new Thread(rr); 
     t.setName(rr.getName()); 
     t.start(); 
    } 


} 

class RecursiveRunnable implements Runnable{ 

    private String name; 
    public RecursiveRunnable(String name) { 
     this.name = name; 
    } 
    public String getName(){return this.name;} 
    @Override 
    public synchronized void run() { 
     System.out.println(Thread.currentThread().getName()); // displaying Thread-0 
     System.out.println(this.name); // displaying "First thread" 

     try{ 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     }finally{ 

     } 
    } 
} 
+0

無論什麼值得,像這樣設置線程名稱都不是線程安全的。 –

+0

@JohnVint,'t.start'前面的't.setName'怎麼樣。 –

+0

是的,這是線程安全的。在啓動線程之前發生的寫入操作在啓動後可見。這實際上是JDK中的一個錯誤,名稱的底層'char []'既不同步也不揮發。 –