zoukankan      html  css  js  c++  java
  • Java并发之CyclicBarrier 可重用同步工具类

     1 package com.thread.test.thread;
     2 
     3 import java.util.Random;
     4 import java.util.concurrent.*;
     5 
     6 /**
     7  * CyclicBarrier
     8  * 同步工具:允许一组线程共同等待一个壁垒点
     9  * 适用于固定数量线程的同步
    10  * 等待线程释放后可以重复使用
    11  * 
    12  * Created by windwant on 2016/5/27.
    13  */
    14 public class MyCyclicBarrier {
    15     public static void main(String[] args) {
    16         ExecutorService es = Executors.newCachedThreadPool();
    17         CyclicBarrier cb = new CyclicBarrier(5, new MainTask());//MainTask可选
    18         Random r = new Random();
    19         es.execute(new SubTask(cb, r.nextInt(10), "task1"));
    20         es.execute(new SubTask(cb, r.nextInt(10), "task2"));
    21         es.execute(new SubTask(cb, r.nextInt(10), "task3"));
    22         es.execute(new SubTask(cb, r.nextInt(10), "task4"));
    23         es.execute(new SubTask(cb, r.nextInt(10), "task5"));
    24         es.shutdown();
    25     }
    26 }
    27 
    28 class MainTask implements Runnable {
    29 
    30     public void run() {
    31         try {
    32             System.out.println("mian task begin");
    33             for (int i = 0; i < 5; i++) {
    34                 Thread.sleep(1000);
    35                 System.out.println("============" + i + "============");
    36             }
    37             System.out.println("mian task implemented");
    38         } catch (Exception e) {
    39             e.printStackTrace();
    40         }
    41 
    42     }
    43 }
    44 
    45 class SubTask implements Runnable{
    46 
    47     private CyclicBarrier cb;
    48 
    49     private int seconds;
    50 
    51     private String taskName;
    52 
    53     SubTask(CyclicBarrier cb, int seconds, String taskName){
    54         this.cb = cb;
    55         this.seconds = seconds;
    56         this.taskName = taskName;
    57     }
    58 
    59     public void run() {
    60         try{
    61             System.out.println("subtask " + taskName + " begin, need time: " + seconds + "s");
    62             long b = System.currentTimeMillis();
    63             for (int i = 0; i < seconds; i++) {
    64                 Thread.sleep(1000);
    65                 System.out.println("subtask: " + taskName + "============" + i + "============");
    66             }
    67             long d = System.currentTimeMillis() - b;
    68             System.out.println("subtask " + taskName + " over, executing time: " + TimeUnit.SECONDS.convert(d, TimeUnit.MILLISECONDS));
    69             cb.await();
    70         } catch (InterruptedException e) {
    71             e.printStackTrace();
    72         } catch (BrokenBarrierException e) {
    73             e.printStackTrace();
    74         }
    75     }
    76 }

    项目地址:https://github.com/windwant/windwant-demo/tree/master/thread-demo

  • 相关阅读:
    [Winform]Media Player com组件应用中遇到的问题
    [Winform]Media Player播放控制面板控制,单击事件截获
    [Winform]Media Player组件全屏播放的设置
    [EF]数据上下文该如何实例化?
    [Winform]在关闭程序后,托盘不会消失的问题
    咏南中间件跨平台解决方案
    硬件中间件
    BASE64使用场景
    DELPHI7 ADO二层升三层新增LINUX服务器方案
    NGINX心跳检测
  • 原文地址:https://www.cnblogs.com/niejunlei/p/5985166.html
Copyright © 2011-2022 走看看