使用Lock锁生产者消费者模式
- package com.java.concurrent;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- /**
- * 生产者消费者模式
- * @author fliay
- *
- */
- public class TestProductorAndConsumerByLock {
- public static void main(String[] args) {
- ClerkByLock c = new ClerkByLock();
- ProductorByLock pro = new ProductorByLock(c);
- ConsumerByLock con = new ConsumerByLock(c);
- new Thread(pro,"生产者A").start();
- new Thread(con,"消费者B").start();
- new Thread(pro,"生产者C").start();
- new Thread(con,"消费者D").start();
- }
- }
- class ClerkByLock{
- //初始化产品
- private int product = ;
- //定义一个Lock锁对象
- private Lock lock = new ReentrantLock();
- //创建condition对象
- private Condition condition = lock.newCondition();
- //进货
- public void get(){
- lock.lock();
- try{
- while(product>=){
- System.out.println("产品已满!");
- try {
- //使用condition进行线程等待
- condition.await();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- condition.signalAll();
- System.out.println(Thread.currentThread().getName()+":"+ ++product);
- }finally{
- //始终会解锁
- lock.unlock();
- }
- }
- //卖货
- public void sale(){
- lock.lock();
- try{
- while(product<=){
- System.out.println("补货中!");
- try {
- condition.await();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- condition.signalAll();
- System.out.println(Thread.currentThread().getName()+":"+ --product);
- }finally{
- lock.unlock();
- }
- }
- }
- class ProductorByLock implements Runnable{
- private ClerkByLock clerk;
- public ProductorByLock(ClerkByLock clerk) {
- this.clerk = clerk;
- }
- public void run() {
- for(int i=;i<;i++){
- clerk.get();
- }
- }
- }
- class ConsumerByLock implements Runnable{
- private ClerkByLock clerk;
- public ConsumerByLock(ClerkByLock clerk) {
- this.clerk = clerk;
- }
- public void run() {
- for(int i=;i<;i++){
- clerk.sale();
- }
- }
- }
欢迎大家加入java资源免费分享群,群号:814657026
使用Lock锁生产者消费者模式的更多相关文章
- 【多线程】--生产者消费者模式--Lock版本
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...
- python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
(1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...
- day 28 :进程相关,进程池,锁,队列,生产者消费者模式
---恢复内容开始--- 前情提要: 一:进程Process 1:模块介绍 from multiprocessing import Process from multiprocessing impo ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- Java 生产者消费者模式详细分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- python3全栈开发-多进程的守护进程、进程同步、生产者消费者模式(重点)
一.守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes a ...
- java ReentrantLock结合条件队列 实现生产者-消费者模式 以及ReentratLock和Synchronized对比
package reentrantlock; import java.util.ArrayList; public class ProviderAndConsumerTest { static Pro ...
- Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码
说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notify ...
- python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)
#######################总结######### 主要理解 锁 生产者消费者模型 解耦用的 队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...
随机推荐
- ssh (免密码登录、开启服务)
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以Unbutun为例.有机器A(192.168.1.155),B(192.168.1.181).现想 ...
- 移植Linux-3.4.2内核到S3C2440
一.BootLoader引导内核过程 1.Bootloader的工作 1.1.将内核读入内存 2.2.保存内核启动参数到指定位置,内核启动时去这个位置解析参数 3.3. ...
- Windows下memcached的安装配置
下载windows 32位或64位 memcached 下载 memcached_dll 1.将第一个包解压放某个盘下面,比如在c:\memcached.2.在终端(也即cmd命令界面)下输入 'c: ...
- java中的finally用return也挡不住
今晚做了科达的题,有一题就是这个意思,我自以为return中断一切,然而事实摆在眼前:
- Ubuntu16.04 install jdk-8u144-linux-x64.tar.gz
打开终端: Ctrl+Alt+T 下载jdk: wget http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b ...
- java泛型使用总结
1. 泛型方法: 2. 泛型类: 3. 通配符. 1.泛型方法 泛型方法在调用时可以接收不同类型的参数.根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用. 下面是定义泛型方法的规则: 所有 ...
- javascript中call()、apply()、bind()的用法终于理解
其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows( ...
- java 学习笔记 读取配置文件的三种方式
package com.itheima.servlet.cfg; import java.io.FileInputStream; import java.io.FileNotFoundExceptio ...
- Java面向对象 网络编程 下
Java面向对象 网络编程 下 知识概要: (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端: ...
- 第九章 MySQL中LIMIT和NOT IN案例
第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...