2011-10-31 6 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(); 
} 
} 

プログラムは、文字列「コンストラクタのiniciadoを示すべきであるが。 "メソッドの他の2つの文字列が実行されます。しかし、コードを実行すると、何も起こらないのは、受け取った出力だけです

loop 
loop 
loop 
loop 
loop 

コンストラクタの文字列が表示されないのはなぜですか?メソッドの実行が期待どおりに実行されないのはなぜですか?コンストラクタやメソッドの実行がまったく実行されていないように見えますが、何がうまくいかないのか分かりません。

答えて

3

あなたはFilosofoクラスを宣言しましたが、そのインスタンスを1つ作成することはありません。

おそらく、各スレッドのスレッドコンストラクタパラメータとして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で一度初期化し、各フィールドのコンストラクタでそのフィールドを渡すことができます、ご存知のように、配列はコピーされず、その配列への参照だけがコピーされます。

またcatch (Exception e)の代わりにcatch (InterruptedException e)を使用してください。 例外のように、印刷するなどの便利なことを行うべきです。 少なくとも例外を無視する場合は、その理由を説明する必要があります。

1

フィロソフォをインスタンス化することはなく、スレッドだけです。

+0

どうすれば修正できますか? – Victor

+0

解決策を見つけました。ありがとうございました。 – Victor

+0

@Victor Salvatoreの回答を参照してください。 –

関連する問題