下面的代码工作正常,但我希望值到达数组的末尾,因为它从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
在知道它将成为一个线程的情况下污染代码 - 它是更好的封装.