2015-04-05 97 views
-2

此代碼根本不打印主線程。它所做的只是打印子線程。但是,如果我做了一個改變,即把這個語句「r.t.start()」從這個try塊中移出並放入它自己的try塊中。所以,當我這樣做時,線程就像他們應該的那樣工作。爲什麼會發生?Java中的線程混淆問題

public class prctc2 { 

    public static void main(String args[]) { 
     NewThread r = new NewThread(); 

     try { 
      r.t.start(); 
      for (int i = 1; i <= 5; i++) { 
       System.out.println(Thread.currentThread().getName() + i); 
       Thread.sleep(1000); 

      } 

     } catch (Exception e) {} 

    } 

} 

class NewThread implements Runnable { 
    Thread t; 

    NewThread() { 
     t = new Thread(this, "new one"); 
    } 

    public void run() { 

     try { 
      for (int i = 1; i <= 5; i++) { 
       System.out.println(t + " " + i); 
       Thread.sleep(500); 
      } 

     } 

     catch (Exception e) {} 
    } 

} 
+5

也許你不應該壓制你所有的例外。 – khelwood 2015-04-05 21:25:02

回答

0

不是一個答案,但我是做程序中的一些變化,使它看起來更專業:

改變prctc2Prctc2。類名稱應該總是大寫。

我從NewThread類中抽取了Thread t成員。一個班級應該只負責一件事情:你們有兩個責任:第一個責任是打印1到5的數字,第二個責任是開始線程。

我將.start()調用移動到main()哪個(IMO)使代碼更容易理解。

我將其更名爲NewThreadMyTask。它是不是一個線程,並且因爲我上面的改變,它不再是一個線程,所以「線程」不應該出現在它的名字中。

我改變了異常處理程序來打印棧跟蹤。你可以做的最糟糕的事情之一是忽略異常。如果它執行了任何您不希望它執行的操作,那麼可能會很難調試您的程序。

public class Prctc2 { 
    public static void main(String args[]) { 
     Thread r = new Thread(new MyTask()); 
     r.start(); 

     try { 
      for (int i = 1; i <= 5; i++) { 
       System.out.println(Thread.currentThread().getName() + i); 
       Thread.sleep(1000); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class MyTask implements Runnable { 
    public void run() { 
     try { 
      for (int i = 1; i <= 5; i++) { 
       System.out.println(t + " " + i); 
       Thread.sleep(500); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}