2012-03-31 78 views
1

我試圖編寫一個使用線程但無法理解o/p的程序。我有2個線程:st。但我看不到線程s正在工作。線程行爲:Java初學者

任何人都可以向我解釋行爲嗎?由於

我的代碼:

public class Bground implements Runnable 
{ 
    Thread t,s; 

    Bground() 
    { 
     t = new Thread(this,"first thread"); 
     s = new Thread(this,"second thread"); 

     s.start(); 
     t.start(); 
    } 

    public void run() 
    { 
     System.out.println("inside run" + t.getName()); 
     try 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       System.out.println("In child thread" + i); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String argv[]) 
    { 
     Bground b = new Bground(); 
     try 
     {     
      for (int i = 0; i < 5; i++) 
      { 
       System.out.println("In main thread" + i); 
       Thread.sleep(1); 
      } 
     } 
     catch(InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

O/P:

C:\ Program Files文件\的Java \ jdk1.6.0_23 \ BIN>的Java Bground

在主thread0
裏面runfirst線程
裏面runfirst線程
在子線程0
在子線程1
在子線程2
在主線程1
在孩子thread3
在孩子thread0
在子線程1
在子線程2
在孩子thread3
在孩子thread4
在主線程2
在子線程中4
在主線程中3
在主線程4

+5

只是爲了讓你知道:每當你像這樣設計你的代碼時,上帝殺死了一隻小貓。 – 2012-03-31 01:00:43

+0

考慮讓每個線程都有一個'Thread.sleep(1000)'。該參數以毫秒爲單位。 – 2012-03-31 01:04:00

回答

2

你有什麼期望將打印出帶有:

System.out.println("inside run " + t.getName()); 

你不在這裏,獲取當前線程的名字,而是你總是給我t-Thread的名字。要修復 - 獲取當前線程並致電getName()就可以了。

+0

是啊,對不起,這是愚蠢的..我證明了一個初學者,力我? :) – RVP 2012-03-31 01:10:38

2

您正在打印兩次線程「t」的名稱。那就是問題所在。另一方面線程似乎對我有用。 你可能想使用此代碼來代替:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 


public class Bground implements Runnable { 
int name; 

Bground(int name) { 
    this.name=name; 
} 

public void run() { 
    System.out.println("inside run" + name); 
    try { 
     for (int i = 0; i < 5; i++) { 
      System.out.println("In child thread" + i); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String argv[]) { 
    Bground b = new Bground(1); 
    Bground b2 = new Bground(2); 

    ExecutorService es = Executors.newFixedThreadPool(2); 
    es.submit(b); 
    es.submit(b2); 
    synchronized (es) { 
     es.notifyAll(); 
    } 

    try { 
     for (int i = 0; i < 5; i++) { 
      System.out.println("In main thread" + i); 
      Thread.sleep(1); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

}