JUC学习(四):线程间定制化通信(案例实现:每个线程打印指定次数)

人生之路不会是一帆风顺的,我们会遇上顺境,也会遇上逆境,在所有成功路上折磨你的,背后都隐藏着激励你奋发向上的动机,人生没有如果,只有后果与结果,成熟,就是用微笑来面对一切小事。

导读:本篇文章讲解 JUC学习(四):线程间定制化通信(案例实现:每个线程打印指定次数),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

        A 线程打印 5 次 A,B 线程打印 10 次 B,C 线程打印 15 次 C,按照此顺序循环 10 轮。

        我们的思路是定义一个标志flag,当flag==1时,线程1打印A;当flag==B时,线程2打印B;当flag==C时,打印C。

/**
 *
 * A 线程打印 5 次 A,B 线程打印 10 次 B,C 线程打印 15 次 C,按照此顺序循环 10 轮
 */


class ShareSource{
    int flag = 1;
    private Lock lock = new ReentrantLock();

    //创建三个condition,一个condition本质上是绑定一个锁
    Condition c1 = lock.newCondition();
    Condition c2 = lock.newCondition();
    Condition c3 = lock.newCondition();

    //打印5次A
    public void print5(int loop) throws InterruptedException {
        lock.lock();
        try {
            while(flag!=1){
                c1.await();
            }
            for (int i = 1; i <= loop; i++) {
                System.out.println(Thread.currentThread().getName()+"打印出:A,当前为第"+i+"轮");
            }
            flag = 2;   //修改标志位
            c2.signal();    //通知线程B

        } finally {
            lock.unlock();
        }
    }


    public void print10(int loop) throws InterruptedException {
        lock.lock();
        try {
            while (flag!=2){
                c2.await();
            }
            for (int i = 1; i <= loop; i++) {
                System.out.println(Thread.currentThread().getName()+"打印出:B,当前为第"+i+"轮");
            }
            flag = 3;
            c3.signal();

        } finally {
            lock.unlock();
        }
    }

    public void print15(int loop) throws InterruptedException {
        lock.lock();
        try{
            while(flag!=3){
                c3.await();
            }
            for (int i = 1; i <= loop; i++) {
                System.out.println(Thread.currentThread().getName()+"打印出:C,当前为第"+i+"轮");
            }
            flag = 1;
            c1.signal();
        }finally {
            lock.unlock();
        }
    }
}

public class ThreadDemo03 {
    public static void main(String[] args) {

        ShareSource shareSource = new ShareSource();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    shareSource.print5(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "线程A").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    shareSource.print10(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "线程B").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    shareSource.print15(15);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "线程C").start();
    }
}

        运行结果:

线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮
线程A打印出:A,当前为第1轮
线程A打印出:A,当前为第2轮
线程A打印出:A,当前为第3轮
线程A打印出:A,当前为第4轮
线程A打印出:A,当前为第5轮
线程B打印出:B,当前为第1轮
线程B打印出:B,当前为第2轮
线程B打印出:B,当前为第3轮
线程B打印出:B,当前为第4轮
线程B打印出:B,当前为第5轮
线程B打印出:B,当前为第6轮
线程B打印出:B,当前为第7轮
线程B打印出:B,当前为第8轮
线程B打印出:B,当前为第9轮
线程B打印出:B,当前为第10轮
线程C打印出:C,当前为第1轮
线程C打印出:C,当前为第2轮
线程C打印出:C,当前为第3轮
线程C打印出:C,当前为第4轮
线程C打印出:C,当前为第5轮
线程C打印出:C,当前为第6轮
线程C打印出:C,当前为第7轮
线程C打印出:C,当前为第8轮
线程C打印出:C,当前为第9轮
线程C打印出:C,当前为第10轮
线程C打印出:C,当前为第11轮
线程C打印出:C,当前为第12轮
线程C打印出:C,当前为第13轮
线程C打印出:C,当前为第14轮
线程C打印出:C,当前为第15轮

Process finished with exit code 0

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/125010.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!