2011-10-31 24 views
0

構造函數和方法,有望在Java程序不工作構造函數和方法無法正常運行中的Java程序

我有以下代碼:

package principal; 
public class Principal { 
public static void main(String[] args) { 
    Thread filosofos[]=new Thread[5]; 
    for (int i=0;i<5;i++) { 
     System.out.println("loop"); 
     filosofos[i]=new Thread(); 
     filosofos[i].start(); 
    } 
    // TODO Auto-generated method stub 
} 
} 

package principal; 
public class Filosofo implements Runnable{ 
static final int tamanho=5; 
static int talheres[]=new int[tamanho]; 
static Semaforo semaforo= new Semaforo(1); 
static int quantidade=0; 
int id; 
public Filosofo(){ 
    System.out.println("Construtor iniciado."); 
    for (int i=0;i<tamanho;i++) { 
     talheres[i]=0; 
    } 
    quantidade++; 
    id=quantidade; 
} 
public void run() { 
    System.out.println("Filosofo "+id+" iniciado"); 
    try { 
     // Filosofo pensando 
     Thread.sleep(1000); 
    } catch (Exception e) { 

    } 
    semaforo.down(); 
    System.out.println("Filosofo "+id+" comendo"); 
    semaforo.up(); 
} 
} 

程序應表現出字符串「Construtor iniciado。 「和另外兩個方法運行的字符串。然而,當我運行的代碼沒有任何反應只是我收到的

loop 
loop 
loop 
loop 
loop 

爲什麼構造函數的字符串沒有顯示出來的輸出?爲什麼該方法運行未按預期運行?它看起來像構造函數和方法運行根本沒有運行,我不知道什麼是錯的。

回答

3

你已經聲明瞭類Filosofo,但是你永遠不會創建它的一個實例。

也許你想傳遞一個Filosofo的新實例作爲每個線程的線程構造參數?

package principal; 

public class Principal 
{ 
    public static void main(String[] args) 
    { 
     Thread filosofos[]=new Thread[5]; 

     for (int i=0;i<5;i++) { 
      filosofos[i]=new Thread(new Filosofo()); 
      filosofos[i].start(); 
     } 
    } 
} 

除此之外,而是採用計數Filosofo實例,爲它們分配一個ID靜態字段,你爲什麼不只是傳遞在構造函數中的ID?

另外其他字段不需要是靜態的,在構造函數中傳遞共享字段,如semaforo,並將它們複製到類字段中。

我不知道talheres字段的含義,我不明白爲什麼要在每個實例構造函數中重新初始化一個靜態字段,也許你可以在main中初始化一次,並在每個Filosofo的構造函數中傳遞該字段,如你所知,數組不會被複制,只有對它們的引用被複制。

而不是catch (Exception e)你應該使用catch (InterruptedException e)。 你應該做一些有用的例外,如打印它。 如果你打算忽略一個異常,至少應該添加一個非常詳細的評論,說明你爲什麼這樣做。

1

你永遠不會實例化任何Filosofo,只是線程。

+0

我該如何解決這個問題? – Victor

+0

我現在找到了解決方案,謝謝。 – Victor

+0

@Victor See Salvatore的答案,我爲此提供了一個潛在的解決方案。 –