gpt4 book ai didi

java - Java 程序中的构造函数和方法未按预期工作

转载 作者:行者123 更新时间:2023-12-01 19:12:28 24 4
gpt4 key购买 nike

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

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

最佳答案

您已声明类 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();
}
}
}

除此之外,为什么不直接在构造函数中传递 id,而不是使用静态字段来计算 Filosofo 实例并为其分配一个 id?

其他字段也不需要是静态的,在构造函数中传递共享字段,例如 semaforo,并将它们复制到类字段中。

我不知道 talheres 字段的含义,也不明白为什么要在每个实例构造函数中重新初始化静态字段,也许您可​​以在 main 中初始化一次并将该字段传递给每个 Filosofo 的构造函数,如您所知,不会复制数组,只会复制对它们的引用。

此外,您应该使用 catch (InterruptedException e),而不是 catch (Exception e)。您应该做一些有用的异常(exception),例如打印它。如果您打算忽略异常,至少您应该添加非常详细的注释来说明为什么要这样做。

关于java - Java 程序中的构造函数和方法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com