首页 > 其他分享 >Condition类_demo

Condition类_demo

时间:2023-06-13 12:05:06浏览次数:48  
标签:pq resource Thread demo private new public Condition

参考:

https://blog.csdn.net/u014082714/article/details/83927697

https://blog.csdn.net/a1439775520/article/details/98471610

Resource.java

package com.hmb;

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

public class Resource {
    private Lock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();
    private int queueSize = 10;
    private PriorityQueue<Integer> pq = new PriorityQueue<>(queueSize);

    public void consume() {
        lock.lock();
        try {
            while (pq.isEmpty()) {
                System.out.println(Thread.currentThread().getName() + "pq is empty, waiting...");
                notEmpty.await();
            }

            pq.poll();
            notFull.signal();
            System.out.println(Thread.currentThread().getName() + "consume a product, pq size: " + pq.size());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void product() {
        lock.lock();
        try {
            while (pq.size() >= queueSize) {
                System.out.println(Thread.currentThread().getName() + "pq is full, waiting...");
                notFull.await();
            }

            pq.offer(1);
            notEmpty.signal();
            System.out.println(Thread.currentThread().getName() + "produce a product, pq size:" + pq.size());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

  

Producer.java

package com.hmb;

public class Producer implements Runnable{
    private Resource resource;
    private volatile int time = 0;

    public Producer(Resource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        while (time < 10) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            resource.product();
            time++;
        }
    }
}

  

Consumer.java

package com.hmb;

public class Consumer implements Runnable{
    private Resource resource;
    private volatile int time = 0;

    public Consumer(Resource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        while (time < 10) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            resource.consume();
            time++;
        }
    }
}

  

Main.java

package com.hmb;

public class Main {
    public static void main(String[] args) {
        Resource resource = new Resource();
        new Thread(new Producer(resource)).start();
        new Thread(new Producer(resource)).start();
        new Thread(new Producer(resource)).start();
        new Thread(new Consumer(resource)).start();
        new Thread(new Consumer(resource)).start();
    }
}

  

运行效果:

 

标签:pq,resource,Thread,demo,private,new,public,Condition
From: https://www.cnblogs.com/hemeiwolong/p/17477128.html

相关文章

  • 序列化和反序列化_demo
    参考:一文搞懂序列化与反序列化-知乎(zhihu.com)一、jdk序列化和反序列化module结构: FactInfo.javapackagecom.hmb;importjava.io.Serial;importjava.io.Serializable;publicclassFactInfoimplementsSerializable{@Serialprivatestaticfinall......
  • C++的多线程编程(练习一下condition_variable)
        嗯,高考结束了,那就编写一个阅卷和查成绩的多线程吧。一个线程老师阅卷,其他三个线程查成绩。代码如下:    1#include<iostream>2#include<thread>3#include<mutex>4#include<condition_variable>5#include<chrono>6#include<futu......
  • Python使用Condition对象实现多线程同步
    使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步。在内部实现上,Condition对象总是与某种锁对象相关联。Condition对象除了具有acquire()和release()方法之外,还有wait()、wait_for()、notify()、notify_......
  • demosaicnet-master的包代码阅读笔记
    init.py我在学init用法时候的笔记该文件里面都是导入模块,其中从dataset.py是导入所有模块,因为模糊导入的__all__没有定义。from.modulesimportBayerDemosaickfrom.modulesimportXTransDemosaickfrom.mosaicimportxtransfrom.mosaicimportbayerfrom.mosaicim......
  • 手把手教你用Python做一个图像融合demo,小白可上手!
    1.创作背景说到融合,一下子会让我们这些95后想起来童年的动漫游戏王了!发动魔法卡——融合!哈哈,今天说得当然不是游戏王里的魔法了,但是我们使用的是Python魔法,今天我们将使用Python编程语言,以及自带的图像处理工具包进行图像融合操作,来实现图像融合的酷炫效果!前几天在网上看了一个dem......
  • Some demos of supervisor conf
    conffilesin/etc/supervisor/conf.d/VersionSupervisorisinstalledbyapt,andit'sversionis:sudosupervisord--version4.1.0ConffilesThereareDjangoprojects,FastAPIprojects,CelerybeatandworkerinthecloudserverDjangoProject......
  • 通过 Demo 理解 hashCode 与 equals 的关系
    packagecom.heatdeath.object;importlombok.extern.slf4j.Slf4j;importjava.util.HashMap;importjava.util.Map;/***Author:heatdeath*Date:2018/4/19*Desc:*/@Slf4jpublicclassEqualsDemo{publicstaticvoidmain(String[]args){......
  • chatglm_langchain_demo
    #Setupenvirnmentcondacreate-nlangchainpython=3.8.1-ycondaactivatelangchain#拉取仓库gitclonehttps://github.com/imClumsyPanda/langchain-ChatGLM.git#安装依赖cdlangchain-ChatGLMpython3-mpipinstall-rrequirements.txtpython3-mpipinstal......
  • demo测试
    1.测试测试{"code":200,"msg":"","data":{"id":23,"userId":17,"name":"demo1","content":"发的范德萨范德萨分",......
  • c++ condition_variable wait unique_lock,cv.notifyall()
    #include<atomic>#include<chrono>#include<cmath>#include<condition_variable>#include<cstddef>#include<forward_list>#include<fstream>#include<functional>#include<future>#include<iom......