• Java多线程Condition定点通知


    多线程之间按顺序调用,实现A->B->C
    三个线程启动,要求如下:
    A打印5次,B打印10次,C打印15次
    接着
     A打印5次,B打印10次,C打印15次
     来10轮

    package com.yangyuanyuan.juc1205;
    
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    class ShareData
    {
        private int number = 1;//A : 1  B:2 C:3
        private Lock lock = new ReentrantLock();
        private Condition c1 = lock.newCondition();
        private Condition c2 = lock.newCondition();
        private Condition c3 = lock.newCondition();
    
        public void print5()
        {
            lock.lock();
            try
            {
                //1 判断
                while(number != 1)
                {
                    //wait.....
                    c1.await();
                }
                //2 干活
                for (int i = 1; i <=5; i++)
                {
                    System.out.println(Thread.currentThread().getName()+"	"+i);
                }
                //3 通知
                number = 2;
                // 如何通知第2个
                c2.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
        public void print10()
        {
            lock.lock();
            try
            {
                //1 判断
                while(number != 2)
                {
                    //wait.....
                    c2.await();
                }
                //2 干活
                for (int i = 1; i <=10; i++)
                {
                    System.out.println(Thread.currentThread().getName()+"	"+i);
                }
                //3 通知
                number = 3;
                // 如何通知第2个
                c3.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
        public void print15()
        {
            lock.lock();
            try
            {
                //1 判断
                while(number != 3)
                {
                    //wait.....
                    c3.await();
                }
                //2 干活
                for (int i = 1; i <=15; i++)
                {
                    System.out.println(Thread.currentThread().getName()+"	"+i);
                }
                //3 通知
                number = 1;
                // 如何通知第2个
                c1.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    }
    
    
    public class ConditionDemo
    {
        public static void main(String[] args)
        {
            ShareData shareData = new ShareData();
    
            new Thread(() -> {
                for (int i = 1; i <=10; i++) {
                    shareData.print5();
                }
            },"A").start();
    
            new Thread(() -> {
                for (int i = 1; i <=10; i++) {
                    shareData.print10();
                }
            },"B").start();
    
            new Thread(() -> {
                for (int i = 1; i <=10; i++) {
                    shareData.print15();
                }
            },"C").start();
    
        }
    }
  • 相关阅读:
    python之内置函数
    装饰器原理剖析
    迭代器&生成器&yield异步
    python之文件操作read
    函数的创建,调用,返回值和传参的讲解
    collections之deque【双向队列】与Queue【单向队列】
    collections之命名元组
    collections系列之OrderedDict【有序字典】与DefaultDict【默认字典】
    collections系列之Counter
    对象之int介绍
  • 原文地址:https://www.cnblogs.com/qfdy123/p/14314694.html
Copyright © 2020-2023  润新知