-2

如果 Array 仅包含"1".

考虑数组的索引对应于线程索引,并且线程"1"在完成工作时将相应的索引设置为。

我必须检查所有线程何时完成它们的工作,或者换句话说,当数组只包含"1".

我已经在“主要”中做到了

Object obj =  new Object();
int[] flag = new int[] {0, 0, 0, 0, 0, 0};
int [] ss = new int[]{1, 1, 1};
for (int i = 0; i < flag.length; i++) {         
    new Thread(new MioThread(i, flag, ss, 1, 0, bw, obj)).start();      
}
synchronized (obj) {
    obj.wait();
}

虽然我在“运行”方法结束时完成了该操作:

synchronized (flag) {
    flag[threadIndex] = 1;
    boolean ok = true;
    for(int i = 0; i< flag.length; i++){
        if(flag[i] == 0)
            ok = false;
    }
    if(ok) {
        synchronized(obj) {
            obj.notify();
        }
    }
}
4

3 回答 3

4

这是一个糟糕的设计。

如果您想要一种阻塞机制 - 只需使用信号量 - 每个线程都会释放一个许可,而您的“加入”线程只会尝试获取 NUM_OF_THREADS 个许可。

如果你想要非阻塞设计,你可以使用原子整数如果你想要异步-导致这个原子整数变为零的线程应该调用一些回调。

于 2013-07-05T12:10:14.413 回答
3

由于您必须检查数组中的每个元素,因此您必须使用 for 循环。但是,我建议使用一AtomicInteger组线程数,并在每次线程完成时递减。当数字达到零时,所有线程都已完成。

于 2013-07-05T12:03:21.310 回答
0

这将做你所说的,但正如其他人所说,有比使用标志数组更好的方法。这里没有错误处理,实际上你不希望在开始时将 allOnes 设置为 true 以防万一你遇到一个让你在不检查所有索引的情况下跳出循环的异常,但对于一个快速而肮脏的例子,它会做。

boolean allOnes = true;
for (int i = 0; i < array.length; i++){
    if (array[i] != 1){
        allOnes = false;
        break;
    }
}
于 2013-07-05T12:23:06.427 回答