博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关卡CyclicBarrier的使用
阅读量:5970 次
发布时间:2019-06-19

本文共 1953 字,大约阅读时间需要 6 分钟。

hot3.png

有时线程之间需要同步。现有如下要求

多线程执行job的两个方法:所有doJob1()执行完之后,doJob2()才开始执行。

package com.wss.lsl.test.driven.runnable;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/** * 多线程执行job的两个方法:所有doJob1()执行完之后,doJob2()才开始执行. * 

 * 使用关卡实现,doJob1()执行完之后,在关卡等待,直到最后一个线程执行完才打开关卡 * 

 *  * @author Administrator *  */public class Job {    public void doJob1() {        System.out.println("doJob1");    }    public void doJob2() {        System.out.println("doJob2");    }    public void run(int threadCount) {        CyclicBarrier entryBarrier = new CyclicBarrier(threadCount);        CyclicBarrier exitBarrier = new CyclicBarrier(threadCount + 1);        for (int i = 0; i < threadCount; i++) {            new Thread(new RunJob(this, entryBarrier, exitBarrier)).start();        }        try {            exitBarrier.await();        } catch (InterruptedException e) {            e.printStackTrace();        } catch (BrokenBarrierException e) {            e.printStackTrace();        }    }    static class RunJob implements Runnable {        private Job job;        // 进入的关卡        private CyclicBarrier entryBarrier;        // 退出的关卡        private CyclicBarrier exitBarrier;        public RunJob(Job job, CyclicBarrier entryBarrier,                CyclicBarrier exitBarrier) {            super();            this.job = job;            this.entryBarrier = entryBarrier;            this.exitBarrier = exitBarrier;        }        @Override        public void run() {            try {                job.doJob1();                // 在关卡等待,直到所有的doJob1执行完                entryBarrier.await();                job.doJob2();                // 配合主线程退出,避免主线程退出而导致程序关闭                exitBarrier.await();            } catch (InterruptedException e) {                e.printStackTrace();            } catch (BrokenBarrierException e) {                e.printStackTrace();            }        }    }}

转载于:https://my.oschina.net/u/2007041/blog/420719

你可能感兴趣的文章
根据request获取请求路径
查看>>
mysql 并行复制
查看>>
傲不可长,欲不可纵,乐不可极,志不可满——提高个人修养
查看>>
linux系统增加swap容量的方法
查看>>
后台调用gps
查看>>
HTML5标签的语义认知和理解(1)
查看>>
MySQL日志功能详解(2)
查看>>
HP LaserJet 305X 和 339X 系列一体机如何设置手动或自动接收传真?
查看>>
linux之权限之隐藏权限
查看>>
XDCTF成长记录
查看>>
Linux系统中的文本处理工具
查看>>
IDE---Python IDE之Eric5在window下的安装
查看>>
Mybatis调用Oracle中的存储过程和function
查看>>
telnet :No route to host
查看>>
基本安装lnmp环境
查看>>
yum源资料汇总
查看>>
7、MTC与MTV,http请求介绍
查看>>
logstash消费阿里云kafka消息
查看>>
第四节课作业
查看>>
EasyUI Calendar 日历
查看>>