如果数组只包含"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();
}
}
}
答案 0 :(得分:4)
这是一个糟糕的设计。
如果你想要一个阻塞机制 - 只需使用一个信号量 - 每个线程将释放一个许可证,你的“加入”线程将只是尝试获得NUM_OF_THREADS个许可证。
如果您想要非阻塞设计,可以使用原子整数 如果你想要异步 - 导致这个原子整数变为零的线程应该调用一些回调。
答案 1 :(得分:3)
由于必须检查数组中的每个元素,因此必须使用for循环。但是我建议使用AtomicInteger
设置为线程数,并在每次线程完成时递减。当数字达到零时,所有线程都已完成。
答案 2 :(得分:0)
这将按照你所说的做,但正如其他人所说,有比使用标志数组更好的方法。这里没有错误处理,实际上你不希望在开始的时候将allOnes设置为true,以防你在没有检查所有索引的情况下遇到异常会使你脱离循环但是对于一个快速而肮脏的例子它会做。
boolean allOnes = true;
for (int i = 0; i < array.length; i++){
if (array[i] != 1){
allOnes = false;
break;
}
}