构造函数和方法在Java程序中无法正常工作

时间:2011-10-31 00:35:11

标签: java multithreading

构造函数和方法在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

为什么构造函数的字符串没有出现?为什么方法运行没有按预期运行?看起来构造函数和方法运行根本没有运行,我不知道出了什么问题。

2 个答案:

答案 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,只是线程。