博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用Condition实现多线程交替执行
阅读量:6341 次
发布时间:2019-06-22

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

一、需求

  • A、B、C 三个线程,循环10次,打印出自己的名称,ABC,ABC,ABC...
  • A、B、C 三个线程,循环10次,打印出自己的名称,A一次,B三次,C五次,ABBBCCCCC,ABBBCCCCC

1.1、循环打印ABC

package com.example.demo.juc;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author DUCHONG * @since 2019-01-21 10:46 **/public class ABC {    public static void main(String[] args) {        PrintDemo pd=new PrintDemo();        //A 线程        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 1; i <=10 ; i++) {                    pd.printA(i);                }            }        },"A").start();        //B 线程        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 1; i <=10 ; i++) {                    pd.printB(i);                }            }        },"B").start();        //C 线程        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 1; i <=10 ; i++) {                    pd.printC(i);                }            }        },"C").start();    }}class PrintDemo{    Lock lock =new ReentrantLock();    private Condition conditionA=lock.newCondition();    private Condition conditionB=lock.newCondition();    private Condition conditionC=lock.newCondition();    //哪个线程等待与否的标记,flag的值:    // 1 线程A打印,否则等待,同时将标记设置为2,唤醒线程B    // 2 线程B打印,否则等待,同时将标记设置为3,唤醒线程C    // 3 线程C打印,否则等待,同时将标记设置为1,唤醒线程A  外层一次循环结束。    private Integer flag=1;    //打印A    public void printA(int loop){        try{            lock.lock();            if(flag!=1){                conditionA.await();            }            for (int i=1;i<=1;i++) {                System.out.println(Thread.currentThread().getName() + "---" + loop);            }            flag=2;            conditionB.signal();        }        catch(Exception e){            e.printStackTrace();        }        finally {            lock.unlock();        }    }    //打印B    public void printB(int loop){        try{            lock.lock();            if(flag!=2){                conditionB.await();            }            for (int i=1;i<=1;i++) {                System.out.println(Thread.currentThread().getName() + "---" + loop);            }            flag=3;            conditionC.signal();        }        catch(Exception e){            e.printStackTrace();        }        finally {            lock.unlock();        }    }    //打印C    public void printC(int loop){        try{            lock.lock();            if(flag!=3){                conditionC.await();            }            for (int i=1;i<=1;i++) {                System.out.println(Thread.currentThread().getName() + "---" + loop);            }            flag=1;            conditionA.signal();        }        catch(Exception e){            e.printStackTrace();        }        finally {            lock.unlock();        }    }}

结果:

1.2、循环打印ABBBCCCC

package com.example.demo.juc;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author DUCHONG * @since 2019-01-21 14:15 **/public class ABBB {    public static void main(String[] args) {        PrintABBBDemo pd=new PrintABBBDemo();        //A 线程        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 1; i <=10 ; i++) {                    pd.printA(i);                }            }        },"A").start();        //B 线程        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 1; i <=10 ; i++) {                    pd.printB(i);                }            }        },"B").start();        //C 线程        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 1; i <=10 ; i++) {                    pd.printC(i);                }            }        },"C").start();    }}class PrintABBBDemo{    Lock lock =new ReentrantLock();    private Condition conditionA=lock.newCondition();    private Condition conditionB=lock.newCondition();    private Condition conditionC=lock.newCondition();    //哪个线程等待与否的标记,flag的值:    // 1 线程A打印,否则等待,同时将标记设置为2,唤醒线程B    // 2 线程B打印,否则等待,同时将标记设置为3,唤醒线程C    // 3 线程C打印,否则等待,同时将标记设置为1,唤醒线程A  外层一次循环结束。    private Integer flag=1;    //打印A    public void printA(int loop){        try{            lock.lock();            if(flag!=1){                conditionA.await();            }            for (int i=1;i<=1;i++) {                System.out.println(Thread.currentThread().getName() + "---" + loop);            }            flag=2;            conditionB.signal();        }        catch(Exception e){            e.printStackTrace();        }        finally {            lock.unlock();        }    }    //打印B    public void printB(int loop){        try{            lock.lock();            if(flag!=2){                conditionB.await();            }            for (int i=1;i<=3;i++) {                System.out.println(Thread.currentThread().getName() + "---" + loop);            }            flag=3;            conditionC.signal();        }        catch(Exception e){            e.printStackTrace();        }        finally {            lock.unlock();        }    }    //打印C    public void printC(int loop){        try{            lock.lock();            if(flag!=3){                conditionC.await();            }            for (int i=1;i<=5;i++) {                System.out.println(Thread.currentThread().getName() + "---" + loop);            }            flag=1;            conditionA.signal();        }        catch(Exception e){            e.printStackTrace();        }        finally {            lock.unlock();        }    }}

结果:

 

转载于:https://www.cnblogs.com/geekdc/p/10298464.html

你可能感兴趣的文章
四零培训之记事本-工程样例
查看>>
grep -w 的解析_学习笔记
查看>>
量化交易之启航
查看>>
TX Text Control文字处理教程(3)打印操作
查看>>
CENTOS 7 如何修改IP地址为静态!
查看>>
MyCat分片算法学习(纯转)
查看>>
IO Foundation 3 -文件解析器 FileParser
查看>>
linux学习经验之谈
查看>>
mysqld_multi实现多主一从复制
查看>>
大数据创业型公司如何降低成本?
查看>>
sql时间转换
查看>>
CNCF权威调研揭示K8s用户所面临的最大挑战
查看>>
中介模式
查看>>
JS中将变量转为字符串
查看>>
servlet笔记
查看>>
JVM(五)垃圾回收器的前世今生
查看>>
CentOS 7 下安装 Nginx
查看>>
Spring Boot 自动配置之@EnableAutoConfiguration
查看>>
去掉项目名访问
查看>>
ElasticSearch与spring boot的集成使用
查看>>