下面的代码工作正常,但我希望值到达数组的末尾,因为它从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);
}
}
Run Code Online (Sandbox Code Playgroud)
我改变了代码,所以循环从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);
}
Run Code Online (Sandbox Code Playgroud)
但是一旦进入连接调试后,程序就会停止.我读到了死锁,也许这就是原因,如果有办法解决这个问题,是否有解决这个问题的一般方法?
编辑:对不起,我没有那么清楚.代码以任何一种方式工作,但是当我第二次运行它时(我的程序在while循环中)它不会进行连接
听起来好像指向的线程boot[1]完成,但指向的线程boot[0]没有完成.
因此,某些事情new Booth(0,buff)会创建一个run()不会终止的对象.
在Booth不使用线程的情况下尝试单元测试,然后运行:
Booth b = new Booth(0,buff); // initialise buff first, of course
b.run();
Run Code Online (Sandbox Code Playgroud)
......看看这是否会回归.如果没有,可以通过调试器逐步解决原因.
要注意的另一件事是共享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();
Run Code Online (Sandbox Code Playgroud)
这样你就不会Booth在知道它将成为一个线程的情况下污染代码 - 它是更好的封装.
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |