您的位置:首页 > 其它

多线程--屏障的使用案例

2015-12-22 19:33 288 查看
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierLearn {

public static void main(String[] args) {

final float x = 0.2f;

int numberOfTerms = 10;

final float[] arr = new float[numberOfTerms];

//一旦barrier获得CPU,必须等到该线程执行完毕,否则CPU不会被释放,之所以出现这中情况
//是因为barrierAction这个以一种回调接口的形式暴漏出来,其实底层的实现机制已经通过模板指定好了规则,当执行该方法之后
//才统一唤醒与之相关的全部线程
CyclicBarrier barrier = new CyclicBarrier(numberOfTerms, new Runnable() {

@Override
public void run() {
float sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("ln (1 - " + x + ") ≈ " + -sum);
}
});

for (int i = 0; i < numberOfTerms; i++) {
new Thread(new TermCacl(barrier, i, x, arr)).start();
}

}

}

class TermCacl implements Runnable {

private int termIndex;

private CyclicBarrier barrier;

private float x;

private float[] arr;

public TermCacl(CyclicBarrier barrier, int termIndex, float x, float[] arr) {
this.barrier = barrier;
this.termIndex = termIndex;
this.x = x;
this.arr = arr;
}

@Override
public void run() {
try {
arr[termIndex] =  (float) (Math.pow(x, termIndex + 1) / (termIndex + 1));
barrier.await();
System.out.println(Thread.currentThread().getName() + termIndex);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: