下面的代码工作正常,但是我希望值到达数组的末尾,因为从1开始,然后到数组的末尾。

Booth[] boot = new Booth[numberOfBooths];


for (int j = 1; j < boot.length; j++) {
    boot[j] = new Booth(j, buff);
    boot[j].start();
}
for (int j =1 ; j < boot.length; j++) {
    try {
        boot[j].join();
    } catch (InterruptedException ex) {
        System.out.println(ex);
    }
}


我更改了代码,因此循环从0开始。

for (int j = 0; j < boot.length; j++) {
    boot[j] = new Booth(j, buff);
    boot[j].start();
}
for (int j =0 ; j < boot.length; j++) {
    try {
        boot[j].join();
    } catch (InterruptedException ex) {
        System.out.println(ex);
}


但是,一旦调试成功,它将停止加入程序。我读到了有关死锁的信息,也许这是造成死锁的原因,是否可以解决这个问题,是否有解决此问题的一般方法?

编辑:对不起,我还不太清楚。该代码以任何一种方式工作,但是当我第二次运行它时(我的程序处于while循环中),它不执行联接

最佳答案

听起来好像boot[1]所指向的线程已完成,但boot[0]所指向的线程却未完成。

因此,关于new Booth(0,buff)的某些内容会创建一个run()不终止的对象。

在不使用线程的情况下尝试单元测试Booth,然后运行:

Booth b = new Booth(0,buff);  // initialise buff first, of course
b.run();


...并查看是否返回。如果不是,请找出原因,也许是通过调试器逐步解决。

需要注意的另一件事是共享buff对象周围的死锁。除非buff有一些锁定,否则您肯定会遇到问题。但是,如果将索引从1开始解决问题,则似乎不太可能。

如果整个事情都是第一次运行,但是没有第二次尝试,那么您应该考虑buff的状态。当提供特定状态的new Booth(0,buff).run()时,也许buff是不终止的。



另外:不执行class Booth extends Thread而是执行class Booth implements Runnable是更清洁的方法。

然后代替Booth.start()使用

Thread t = new Thread(booth);
t.start();


这样一来,您就不会知道Booth代码将成为线程,而不会污染代码-更好的封装。

07-25 23:50