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

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();
        }
    }
}
时间: 2024-12-26 18:33:21

多线程--屏障的使用案例的相关文章

多线程十大经典案例之一 双线程读写队列数据

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8646902 欢迎关注微博:http://weibo.com/MoreWindows 在<秒杀多线程系列>的前十五篇中介绍多线程的相关概念,多线程同步互斥问题<秒杀多线程第四篇一个经典的多线程同步问题>及解决多线程同步互斥的常用方法

秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8646902 欢迎关注微博:http://weibo.com/MoreWindows 在<秒杀多线程系列>的前十五篇中介绍多线程的相关概念,多线程同步互斥问题<秒杀多

多线程的对比与案例(计算目录下文件的大小)

本人使用的是mac 所以有usr目录.把以下的几种情况分别贴出来给大家分析下各自有什么优缺点! 1.顺序计算目录大小code: package jvm; import java.io.File; /** * 第一版 * 顺序计算目录大小 * @author zeuskingzb * */ public class TotalFileSizeSequential { private long getTotalSizeOfFilesInDir(File file){ if (file.isFile(

多线程面试题系列(16):多线程十大经典案例之一 双线程读写队列数据

前十五篇中介绍多线程的相关概念,多线程同步互斥问题(第四篇)及解决多线程同步互斥的常用方法--关键段.事件.互斥量.信号量.读写锁.为了让大家更加熟练运用多线程,将会有十篇文章来讲解十个多线程使用案例,相信看完这十篇后会让你能更加游刃有余的使用多线程. 首先来看第一篇--第十六篇 多线程十大经典案例之一 双线程读写队列数据 <多线程十大经典案例之一双线程读写队列数据>案例描述: MFC对话框中一个按钮的响应函数实现两个功能:显示数据同时处理数据,因此开两个线程,一个线程显示数据(开了一个定时器

Python爬虫(十八)_多线程糗事百科案例

多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用:队列时线程间最常用的交互数据的形式. python下多线程的思考 对于资源,加锁是个重要的环节.因为python原生的list,dict等,都是not thread safe的.而Queue,是线程安全的,因此在满足使用条件下,建议使用队列 初始化:

python 多线程糗事百科案例

案例要求参考上一个糗事百科单进程案例 Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;队列是线程间最常用的交换数据的形式 python下多线程的思考 对于资源,加锁是个重要的环节.因为python原生的list,dict等,都是not thread safe的.而Queue,是线程安全的,因此在满足使用条件下,建议使用队列 初始化: class Queue.Queue(maxsize) FIFO 先进先出 包中的常用方法: Queue.qsize

python 远程批量多线程paramiko 和 threading案例

初步理解多线程的好处 这两个例子告诉我们同样的事情,一个用了8s一个用了5s这就是多线程并发执行的好处. paramiko 和 threading 多线程远程执行的基本案例--[[email protected] pythontest]# cat paramiko-threading.py#!/usr/bin/python#coding:utf-8#from settings.py import *import paramikoimport threadingimport timedef tun

多线程糗事百科案例

Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;队列是线程间最常用的交换数据的形式 python下多线程的思考 对于资源,加锁是个重要的环节.因为python原生的list,dict等,都是not thread safe的.而Queue,是线程安全的,因此在满足使用条件下,建议使用队列 初始化: class Queue.Queue(maxsize) FIFO 先进先出 包中的常用方法: Queue.qsize() 返回队列的大小 Queue.em

java 多线程-线程不安全案例

抢票案例: public class n { public static void main(String[]args) throws InterruptedException { web wb=new web(); new Thread(wb,"a").start(); new Thread(wb,"b").start(); new Thread(wb,"c").start(); } } class web implements Runnabl