CyclicBarrier在多线程同步运行后相互访问的问题。

CyclicBarrier的介绍

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

举个例子,多个线程调用,如果想要在多个线程每运行N次后,相互访问一次,这种可以映射到遗传算法的并行中去,种群之间每隔K代就相互交流一次。

public class demo6 {
    public static void main(String[] args) {
         CyclicBarrier barrier = new CyclicBarrier(5,new Runnable() {

            @Override
            public void run() {
                System.out.println("=======================");

            }
        });
         new Thread(new thread(1,"周一",barrier    )).start();
         new Thread(new thread(2,"赵二",barrier    )).start();
         new Thread(new thread(3,"张三",barrier    )).start();
         new Thread(new thread(4,"李四",barrier    )).start();
         new Thread(new thread(5,"王五",barrier    )).start();
    }
}
class thread implements Runnable {
    private int id;//标识每个线程
    private String data;
    private static String[] sourse = new String[5] ;
    CyclicBarrier barrier;

    public thread(int id, String data, CyclicBarrier barrier) {
        this.id = id;
        this.data = data;
        this.barrier = barrier;
    }

    public void run()
    {
          try{
          for(int i = 0 ; i < 10 ; i ++){
            for(int j = 0 ; j <10 ; j ++)
            {
                //执行各自种群之间进化,隔十代就会进行一次种群交流
            }
            sourse[id-1] = data;
            barrier.await();
            data= sourse[(id)%5] ;
            System.out.println(id +"  "+ data);
            barrier.await();
          }
          }catch(Exception e)
          {
              e.printStackTrace();
          }

    }
}

每隔10带,就会改变一次data 的值。

=======================
1  赵二
4  王五
5  周一
2  张三
3  李四
=======================
=======================
2  李四
4  周一
1  张三
3  王五
5  赵二
=======================
=======================
3  周一
2  王五
5  张三
1  李四
4  赵二
时间: 2024-10-10 09:13:33

CyclicBarrier在多线程同步运行后相互访问的问题。的相关文章

多台Linux服务器SSH相互访问无需密码

摘录:http://www.linuxidc.com/Linux/2013-02/79156p2.htm 一.环境配置 1.系统:CentOS release 5.6  IP:192.168.4.200  主机名:JW01 2.系统:CentOS release 5.9  IP:192.168.4.244  主机名:JW02 3.系统:CentOS release 5.3  IP:192.168.4.232  主机名:KT01 4.系统:Red Hat  release 4  IP:192.16

利用IPSec VPN 实现总分公司跨Internet相互访问!

1.要求 某公司为了降低人员成本,在中小城市建立了分公司,但是为了保证数据,业务和总公司同步,必须保证数据业务的安全性. 2,提出利用IPsec VPN 技术分别在分,总公司的网关路由器上搭建.                                                         实施原理  1对等体IPSec 连接需要三个步骤. (1)流量触发       IPSec 建立过程是由对等体之间发送的流量触发的,需要明确哪些流量需要被保护. (2)建立管理连接     

不同网段设备相互访问

现在有一个需求,A子网和B子网处于不同网段,当网络中存在多个路由器时,要求不同路由器下属的子网可以互相通讯,同时又可以通过宽带路由器上网,这如何实现?在查阅了大量资料和参考了网上现有的解决方案下,得出如下解决方法,更加详细的说明,请设置静态路由不同网段互相访问参考. 先介绍几个基本知识. 1. 网关,简单来说就是网络中数据的关口,网关的IP地址就是具有路由功能设备的IP地址,而此类设备可以是路由器.启动路由协议的服务器或者代理服务器等. 2. 路由就是把信息从源传输到目的地的行为,在大多数宽带路

HashMap多线程put后get为null的原因

一.多线程put后get为null 源码定位 1 void transfer(Entry[] newTable) { 2 Entry[] src = table; 3 int newCapacity = newTable.length; 4 for ( int j = 0 ; j < src.length; j++) { 5 Entry e = src[j]; 6 if (e != null ) { 7 src[j] = null ;//将table[j]设置为null,并发访问到 原table

js对象字面量属性间相互访问的问题 和 这个问题与执行环境的关系

对象字面量属性间无法相互访问的问题: 我曾经在定义一个对象时, 并出于复用性的考虑试图复用某些属性: // test 1 var person = { firstName : "Bill", lastName : "Gates", fullName : firstName + " " + lastName // 这里报错 } alert(person.firstName); alert(person.lastName); alert(person

ios 7.1 7.1.1 半完美越狱后 电脑访问手机越狱目录的方法

7.1和7.1.1由于越狱不成熟,半完美越狱后电脑上无法访问系统越狱目录,如var usr 等等. 今天有些意外地发现,可以在电脑上使用手机的越狱目录我手机 i4 7.1.1 联通 半完美越狱,没装Afc2Add,也没装Appsync 附上  --->我的半完美越狱过程 好了,下面直接正题 一.前提,必须安装ifile! 打开ifile,并转到 /var/mobile/media 目录下,然后点击右上角的 [ 编辑 ]如图: 二.点左下角的 + 号创建,如图: 三.点 [ 类型],选择[符号链接

MFC框架类、文档类、视图类相互访问的方法

1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd); 或者 CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); 3.获取菜单指针 CMenu* pMenu = AfxGetMain

vitualbox 主机与虚拟机能相互访问的设置

1. 桥接网卡 2. 界面名称:802.11n USB Wireless Lan Card 3. 混杂模式:全部允许 4. 接入网线打勾 5. 确定 vitualbox 主机与虚拟机能相互访问的设置,布布扣,bubuko.com

myeclipse 重命名项目名后不能访问

myeclipse 重命名项目名后不能访问 由于处于命名的规范:最近修改了一个项目的项目名,但发现修改后的项目名不能访问,而输入原先的项目名还是可以访问的, 然后去tomcat下看了下,发现还是原来的项目名那就需要更改tomcat下根目录的文件名: 项目上右击鼠标-->Properties-->MyEclipse-->Web-->Content Root-->Web content-root下改成你想要的新的项目名即可 这里也可将/cxfVSsshVSjbpm改为/,那么该项