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 赵二