ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JUC练习3——lock实现精准唤醒demo

2022-01-11 13:33:31  阅读:173  来源: 互联网

标签:JUC java concurrent int demo locks lock import 执行


实现精准唤醒:A执行后,B执行,B执行后C执行,C执行后A执行——》针对多线程下生产流水线问题,例如:C需要执行必须完成B操作,B操作需要执行必须要完成A操作

代码示例如下所示:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class test
{
    public static void main(String[] args) {
        Data data = new Data();

        new Thread(()->{
            for (int i=1;i<=10;i++)
            {
                data.printA();
            }
        },"线程A").start();

        new Thread(()->{
            for (int i=1;i<=10;i++)
            {
                data.printB();
            }
        },"线程B").start();

        new Thread(()->{
            for (int i=1;i<=10;i++)
            {
                data.printC();
            }
        },"线程C").start();
    }
}

class Data
{
    private String executor = "A";   //标识,当前可执行的操作
    private Lock lock = new ReentrantLock();  //锁,为了使得多个操作同步进行,这三个操作公用一把锁
    private Condition conditionA = lock.newCondition();  //A操作的等待唤醒
    private Condition conditionB = lock.newCondition();  //B操作的等待唤醒
    private Condition conditionC = lock.newCondition();  //C操作的等待唤醒

    public void printA()
    {
        lock.lock();//上锁
        try
        {
            while (executor!="A")//使用while判断不使用if判断,防止虚假唤醒
            {
                conditionA.await();
            }
            executor="B";//指定下一个操作者
            conditionB.signal();//将其唤醒
            System.out.println(Thread.currentThread().getName()+"执行了,唤醒B");
        }catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            lock.unlock();//shi释放占有的锁
        }
    }

    public void printB()
    {
        lock.lock();
        try
        {
            while (executor!="B")
            {
                conditionB.await();
            }
            executor="C";
            conditionC.signal();
            System.out.println(Thread.currentThread().getName()+"执行了,唤醒C");
        }catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            lock.unlock();
        }
    }

    public void printC()
    {
        lock.lock();
        try
        {
            while (executor!="C")
            {
                conditionC.await();
            }
            executor="A";
            conditionA.signal();
            System.out.println(Thread.currentThread().getName()+"执行了,唤醒A");
        }catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            lock.unlock();
        }
    }
}

  

标签:JUC,java,concurrent,int,demo,locks,lock,import,执行
来源: https://www.cnblogs.com/chenjianjiang/p/15787876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有