首页 > 其他分享 >JUC系列之(八)Condition控制线程通信

JUC系列之(八)Condition控制线程通信

时间:2024-02-29 19:37:03浏览次数:24  
标签:JUC Thread lock 控制线 Lock new public Condition

Condition控制线程通信

对象 等待 唤醒 唤醒所有
Object wait() notify() notifyAll()
Condition await() signal() signalAll()

Lock同步锁的线程通信需要通过Condition实现

通过Lock+Condition实现上一节最后的生产者消费者案例

package com.atguigu.juc;

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

/**
 * 售货员从啤酒厂上货,张三买货
 */
public class TestProductorAndConsumer {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();

        Productor productor = new Productor(clerk);
        Consumer consumer = new Consumer(clerk);

        new Thread(productor, "啤酒厂").start();
        new Thread(consumer, "张三").start();
        new Thread(productor, "烟厂").start();
        new Thread(consumer, "李四").start();
    }

}

/**
 * 售货员
 */
class Clerk{
    private int product = 0;

    Lock lock  = new ReentrantLock();
	// Condition实例实质上被绑定到了一个锁上,要为特定的Lock实例获得Condition实例,需要使用newCondition()方法
    Condition condition = lock.newCondition();

    public void get(){
        lock.lock();

        try {
            while (product >= 1){
                System.out.println("产品已满!");
                try {
                    // 告知啤酒厂库存满了
                    // this.wait();
                    condition.await();
                } catch (InterruptedException e) {
                }
            }
            System.out.println("从" + Thread.currentThread().getName() + "上新货 : " + ++product);
            // 通知张三新货到了
            // this.notifyAll();
            condition.signalAll();
        }finally {
            lock.unlock();
        }
    }

    public void sale(){
        lock.lock();

        try {
            while (product <= 0){
                System.out.println("缺货!");
                try {
                    // 告知张三没货了
                    // this.wait();
                    condition.await();
                } catch (InterruptedException e) {
                }
            }
            System.out.println(Thread.currentThread().getName() + "买了啤酒" + product--);
            // 通知啤酒厂,又卖掉货了,有空位了,可以生产啤酒了
            // this.notifyAll();
            condition.signalAll();
        }finally {
            lock.unlock();
        }
    }
}

/**
 * 啤酒厂
 */
class Productor implements Runnable{

    private Clerk clerk;

    Productor(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 3; i++) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
            }
            this.clerk.get();
        }
    }
}

/**
 * 消费者
 */
class Consumer implements Runnable{

    private Clerk clerk;

    Consumer(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 3; i++) {
            this.clerk.sale();
        }
    }
}

标签:JUC,Thread,lock,控制线,Lock,new,public,Condition
From: https://www.cnblogs.com/wzzzj/p/18045241

相关文章

  • JUC系列之(七)Lock同步锁
    Lock同步锁用于解决多线程安全问题的方式:同步代码块,synchronized实现,隐式锁同步方法,synchronized实现,隐式锁同步锁Lock:jdk1.5以后注:是一个显示锁,需要通过lock()方法上锁,必须通过unlock()方法进行释放锁(一定要将unlock()放到finally中,保证一定会释放锁),更加灵活示例......
  • JUC系列之(六)实现Callable接口
    实现Callable接口创建执行线程的第三种方式,共四种比较Runnable和Callable:Callable方法可以有返回值,并且可以抛出异常。由于Callable的方法有返回值,需要FutureTask的支持,用于接收运算结果。FutureTask是Future接口的实现类。使用packagecom.atguigu.juc;importjava.......
  • JUC系列之(五)CountDownLatch闭锁
    CountDownLatch闭锁闭锁:延迟当前线程的进度,直到其他线程都执行完成当前线程才继续执行。示例:计算多线程操作耗费时间以下操作时无法正常计算多线程操作耗时的packagecom.atguigu.juc;publicclassTestCountDownLatch{publicstaticvoidmain(String[]args){......
  • JUC系列之(四)ConcurrentHashMap锁分段机制
    ConcurrentHashMap锁分段机制1.关于HashMap和HashTableHashMap:线程不安全HashTable:效率低:操作时锁整个表复合操作会带来安全问题//table.contains()和table.put()分别都是加了锁的,但是像下述复合操作,一个线程判断完之后CPU可能被其他线程抢夺,带来安全问题if(!table.c......
  • JUC系列之(三)原子变量
    原子变量-CAS算法1.i++的原子性问题i++的计算原理:读-改-写inttemp=i;i=i+1;将i++赋给其他变量的时候会将temp的值赋给其他变量,比如:inti=10;i=i++;//这里i的值就是10,i++的值实际上就是临时变量temp的值i++的原子性问题实例packagecom.atguigu.juc;......
  • JUC系列之(二)volatile关键字
    volatile关键字-内存可见性引出内存可见性问题的示例:packagecom.atguigu.juc;publicclassTestVolatile{publicstaticvoidmain(String[]args){//线程threadDemo修改共享变量的值ThreadDemothreadDemo=newThreadDemo();newThrea......
  • Go - Data races vs. race conditions
         ......
  • JUC并发编程与源码分析
    基础JUC是java.util.concurrent在并发编程中使用的工具包。线程的start()方法底层使用本地方法start0()调用C语言接口,再由C语言接口调用操作系统创建线程。publicclassdemo(){publicstaticvoidmain(Strings[]args){Threadt1=newThread(()->{System......
  • 使用lanczos算法进行的预处理共轭梯度算法(Preconditioned Conjugate Gradients Metho
    构造预处理矩阵M(对称正定)下图来自:预处理共轭梯度法(1)......
  • 预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)
    预处理共轭梯度算法(PreconditionedConjugateGradientsMethod)给出百度百科上的解释:预处理共轭梯度法预处理共轭梯度法是。不必预先估计参数等特点。共轭梯度法近年来在求解大型稀疏方程组中取得了较好的成效。理论上普通的共扼梯度法对于对称超正定方程,只要迭代步数达到......