当前位置:  开发笔记 > 编程语言 > 正文

当增加1个Java时,线程没有完成

如何解决《当增加1个Java时,线程没有完成》经验,为你挑选了1个好方法。

下面的代码工作正常,但我希望值到达数组的末尾,因为它从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循环中)它不会进行连接



1> slim..:

听起来好像指向的线程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在知道它将成为一个线程的情况下污染代码 - 它是更好的封装.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有