构造函数和方法在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”。和其他2个方法字符串运行。但是,当我运行代码时,没有任何事情只发生我收到的输出
loop
loop
loop
loop
loop
为什么构造函数的字符串没有出现?为什么方法运行没有按预期运行?看起来构造函数和方法运行根本没有运行,我不知道出了什么问题。
答案 0 :(得分: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 :(得分:1)
你永远不会实例化任何Filosofo,只是线程。