多线程--屏障的使用案例
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(); } } }
相关文章推荐
- Java EE面试笔试
- swift 8583报文组装库
- 块状链表(附NOI 2003 Editor,POJ 2131 Key Insertion)
- mac系统上查阅unicode字符集
- 深入Java虚拟机:JVM中的Stack和Heap
- Java工程师成神之路
- phantomjs学习资料
- HTML&CSS----练习做网页
- DownloadManager 解析
- ubuntu下FFMPEG编译安装
- Google Android JNI 使用方法
- Objective-C:Foundation框架-结构体
- 科大讯飞,语音在线合成
- 关于如何寻找xss漏洞并绕过限制
- 我的java基础学习2
- stand up meeting 12/22/2015 && 用户体验收录
- 思杰 Citrix xen server 6.2 企业级布署(二) XenCenter client install
- 思杰 Citrix xen server 6.2 企业级布署(二) XenCenter client install
- 思杰 Citrix xen server 6.2 企业级布署(二) XenCenter client install
- HDU 1712 ACboy needs your help DP