下面的代码工作正常,但是我希望值到达数组的末尾,因为从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
代码将成为线程,而不会污染代码-更好的封装。