public class Watek implements Runnable {
Semaphore sem = new Semaphore(1);
int index = 0;
int zakres = 0;
Counter sum;
private LinkedList < Integer > tablica;
public Watek(int pivot_index, int chunk, Counter Atomic_var, LinkedList < Integer > tab) {
index = pivot_index;
zakres = chunk;
sum = Atomic_var;
tablica = tab;
}
@Override
public void run() {
try {
int zm = 0;
for (int j = index; j < zakres; j++) {
zm += tablica.get(j);
}
sem.acquire();
sum.add(zm);
sem.release();
} catch (InterruptedException ex) {
Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我有点不确定我是否将二进制信号量放在正确的位置,因为我正在使用100个线程增加1维矩阵的值,当我使用信号量时,有时结果会像矩阵一样错误[100000我有时会得到100000有时98000,但是当我检查低线程数量时,如果更高的风险也更高,那么当你检查少量的线程时,这是信号量的错误或某处有错误吗?
答案 0 :(得分:3)
您不应在runnable中创建信号量实例。在这种情况下,runnable的每个实例都有自己独特的信号量,因此您没有像预期的那样阻塞。
相反,在runnable外部创建信号量,并将其传递给runnable对象(例如通过构造函数),因此runnable的每个实例都使用相同的信号量。