其他分享
首页 > 其他分享> > JUC练习3——lock实现精准唤醒demo

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

作者:互联网

实现精准唤醒: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