为了更好地理解它,我从oracle page获取了CyclicBarrier代码。我修改了它,现在有一个疑问。下面的代码不会终止,但如果我取消对Thread.sleep条件的注释,它会工作得很好。
import java.util.Arrays;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
class Solver {
final int N;
final float[][] data;
boolean done = false;
final CyclicBarrier barrier;
class Worker implements Runnable {
int myRow;
Worker(int row) {
myRow = row;
}
public void run() {
while (!done) {
processRow(myRow);
try {
barrier.await();
} catch (InterruptedException ex) {
return;
} catch (BrokenBarrierException ex) {
return;
}
}
System.out.println("Run finish for " + Thread.currentThread().getName());
}
private void processRow(int row) {
float[] rowData = data[row];
for (int i = 0; i < rowData.length; i++) {
rowData[i] = 1;
}
/*try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
done = true;
}
}
public Solver(float[][] matrix) {
data = matrix;
N = matrix.length;
barrier = new CyclicBarrier(N, new Runnable() {
public void run() {
for (int i = 0; i < data.length; i++) {
System.out.println("Data " + Arrays.toString(data[i]));
}
System.out.println("Completed:");
}
});
for (int i = 0; i < N; ++i)
new Thread(new Worker(i), "Thread "+ i).start();
}
}
public class CyclicBarrierTest {
public static void main(String[] args) {
float[][] matrix = new float[5][5];
Solver solver = new Solver(matrix);
}
}为什么在上面的代码中需要Thread.sleep?
发布于 2013-06-17 01:12:23
我没有运行你的代码,但是可能有一个竞态条件,下面是一个揭示它的场景:
当启动第一个线程时,它会在一段时间内运行,这段时间足以让它完成processRow方法调用,因此它将done设置为true,然后在屏障上等待,
为什么它与睡眠一起工作
但请注意,如果你的系统是超载的,它可能会死锁:
和一种可能的解决方案(对不起,未经过测试):
为do/ while 循环更改while循环:
do
{
processRow(myRow);
...
}
while (!done);https://stackoverflow.com/questions/17135293
复制相似问题