首页 > 编程语言 > 其他编程

编程语言JUC之分别打印A,B,C

admin 其他编程 2021-05-25 17:52:09 打印 JUC 
后台-系统设置-扩展变量-手机广告位-内容正文底部

JUC之分别打印A,B,C

线程的并发编程:

什么是juc: juc是java.util.concurrent下的类包,专门用于多线程的处理。

并发编程的本质目的就是为了充分发挥出CPU的计算能力。

上代码分析:

要求:一个程序,开启3个线程,线程id分别为A, B, C, 使这3个线程按顺序执行,运行次数自定。

/**
 * 要求:一个程序,开启3个线程,线程id分别为A, B, C, 使这3个线程按顺序执行,运行次数自定。
 */
public class TestABCAlternate {
    public static void main(String[] args) {
        ConcurrentDemo ad = new ConcurrentDemo();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    ad.loopA(i);
                }
            }
        }, "A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    ad.loopB(i);
                }
            }
        }, "B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    ad.loopC(i);

                    System.out.println("-----------------------");
                }
            }
        }, "C").start();
    }
}

class ConcurrentDemo {
    private int flag = 1;//当前正在执行线程的标记

    /*
    * 实例化ReentrantLock对象(可重入,可中断,公平锁)等特点
    * 可重入:能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞
    * 可中断:当等待中,线程可以中断等待去执行其他任务
    * 公平锁:比较等待时间
    * */
    private Lock lock = new ReentrantLock();
    //产生与当前重入锁绑定的Condtion实例
    private Condition cd1 = lock.newCondition();
    private Condition cd2 = lock.newCondition();
    private Condition cd3 = lock.newCondition();

    public void loopA(int runTimes) {
        //上锁
        lock.lock();
        try {
            //1.判断
            if (flag != 1) {
                //进入等待状态
                cd1.await();
            }
            //打印
            for (int i = 0; i < 1; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + runTimes);

            }
            //唤醒线程
            flag = 2;
            cd2.signal();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //要在finally里面解锁,要不然可能会出现异常
            lock.unlock();
        }

    }

    public void loopB(int runTimes) {
        lock.lock();
        try {
            //1.判断
            if (flag != 2) {
                cd2.await();
            }
            //打印
            for (int i = 0; i < 1; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + runTimes);

            }
            //唤醒
            flag = 3;
            cd3.signal();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }

    public void loopC(int runTimes) {
        lock.lock();
        try {
            //1.判断
            if (flag != 3) {
                cd3.await();
            }
            //打印
            for (int i = 0; i < 1; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + runTimes);

            }
            //唤醒
            flag = 1;
            cd1.signal();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }
}

文章来源:https://www.cnblogs.com/haotian6/archive/2021/05/25/14807875.html

后台-系统设置-扩展变量-手机广告位-内容正文底部
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
本文地址:https://www.jcdi.cn/qtbc/30913.html

留言与评论(共有 0 条评论)
   
验证码:
后台-系统设置-扩展变量-手机广告位-评论底部广告位

教程弟

https://www.jcdi.cn/

统计代码 | 京ICP1234567-2号

Powered By 教程弟 教程弟

使用手机软件扫描微信二维码