六种方式实现生产者消费者(未完)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、利用Object对象是wait和notify\notifyAll

    

package com.jv.parallel.consumerandproducer.objectwait;public class Car {private volatile int flag = 0;public void showConsumer(){System.out.println("I am a Car ! 我已经被消费");}public void showProducer(){System.out.println("I am a Car ! 我已经被生产");}public int getFlag(){return flag;}public void setFlag(int flag){this.flag=flag;}
}

 

package com.jv.parallel.consumerandproducer.objectwait;public class Consumer extends Thread{private Car car;public Consumer() {// TODO Auto-generated constructor stub}public Consumer(Car car){this.car = car;}@Overridepublic void run() {while(true){synchronized(car){try {while(car.getFlag()==0){car.wait();}car.setFlag(0);car.showConsumer();car.notifyAll();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

 

package com.jv.parallel.consumerandproducer.objectwait;public class Producer extends Thread{private Car car;public Producer(){}public Producer(Car car){this.car = car;}public void run() {while(true){synchronized(car){try {while(car.getFlag()==1){car.wait();}car.setFlag(1);car.showProducer();car.notifyAll();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

 

package com.jv.parallel.consumerandproducer.objectwait;public class Test {public static void main(String[] args) {Car car  = new Car();Consumer cs = new Consumer(car);Producer pd = new Producer(car);cs.start();pd.start();}
}

 

二、使用Lock.Condition

    

package com.jv.parallel.consumerandproducer.lock;public class Car {private volatile int flag = 0;public void showConsumer(){System.out.println("I am a Car ! 我已经被消费");}public void showProducer(){System.out.println("I am a Car ! 我已经被生产");}public int getFlag(){return flag;}public void setFlag(int flag){this.flag=flag;}
}
package com.jv.parallel.consumerandproducer.lock;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class Consumer implements Runnable{private Car car;private Lock lock;private Condition cd ;public Consumer() {// TODO Auto-generated constructor stub}public Consumer(Car car,Lock lock,Condition cd){this.car=car;this.lock=lock;this.cd=cd;}@Overridepublic void run() {while(true){lock.lock();try{while(car.getFlag()==0){cd.await();}car.setFlag(0);car.showConsumer();cd.signal();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally{lock.unlock();}}}
}
package com.jv.parallel.consumerandproducer.lock;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class Producer implements Runnable{private Car car;private Lock lock;private Condition cd ;public Producer() {// TODO Auto-generated constructor stub}public Producer(Car car,Lock lock,Condition cd){this.car=car;this.lock=lock;this.cd=cd;}@Overridepublic void run() {while(true){lock.lock();try{while(car.getFlag()==1){cd.await();}car.setFlag(1);car.showProducer();cd.signal();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally{lock.unlock();}}}
}
package com.jv.parallel.consumerandproducer.lock;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) {Lock lock = new ReentrantLock();Car car = new Car();Condition cd = lock.newCondition();Thread t1 = new Thread(new Consumer(car,lock,cd));Thread t2 = new Thread(new Producer(car,lock,cd));t1.start();t2.start();}
}

 

三、使用阻塞队列

设置阻塞队列长度为1,使用put和take方法(可阻塞)

package com.jv.consumerandproducer.queue;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class TestQueue {	public static void main(String[] args) {BlockingQueue<Car> queue = new ArrayBlockingQueue<Car>(1);Consumer c = new Consumer(queue);Producer p = new Producer(queue);Thread t1 = new Thread(c);Thread t2 = new Thread(p);t1.start();t2.start();System.out.println("main haved end");}}
class Consumer implements Runnable{BlockingQueue<Car> queue;public Consumer(BlockingQueue<Car> queue){this.queue=queue;}@Overridepublic void run() {Car c ;while(true){try {c = queue.take();c.showConsumer();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}class Producer implements Runnable{BlockingQueue<Car> queue;public Producer(BlockingQueue<Car> queue){this.queue=queue;}@Overridepublic void run() {Car c ;while(true){try{c = new Car();queue.put(c);c.showProducer();Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}}}}
package com.jv.consumerandproducer.queue;public class Car {private volatile int flag = 0;public void showConsumer(){System.out.println("I am a Car ! 我已经被消费");}public void showProducer(){System.out.println("I am a Car ! 我已经被生产");}public int getFlag(){return flag;}public void setFlag(int flag){this.flag=flag;}
}

四、利用FutureTask实现

    还需要研究它的内部实现原理

    代码待补充

五、使用信号量实现

    其内部原理还是利用被包装过的同步器的condition对象实现

    代码待补充

六、使用Redis列表数据类型实现

    因为它具有可阻塞特性。

    代码待补充

转载于:https://my.oschina.net/u/3049601/blog/912986

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL中基于代价的优化

还记得笔者在上篇文章无意中挖的一个坑么&#xff1f;如若不知&#xff0c;强烈建议看官先行阅读前面两文&#xff0d;《SparkSQL Join原理》和《Join中竟然也有谓词下推?》 第一篇文章主要分析了大数据领域Join的三种基础算法以及各自的适用场景&#xff0c;第二篇文章在第一…

git如何解决冲突(代码托管在coding)

分支A提交合并请求到分支B&#xff0c;有冲突git fetch code 拉取远程仓库的其他分支代码&#xff08;我拉代码是remote add code所以这里是code,可以用git remote查看&#xff09;git checkout 分支A 切换到分支Agit pull code 分支A 拉取分支A代码git checkout 分支B 切换到分…

cookie和session之会话机制:   http 协议  ---》 无状态协议

设置cookie&#xff1a; 通过response对象&#xff1a; response make_response() response.set_cookie(key,value,max_age(单位second),expires(要求是detetime类型)) expires datetime(year2018,month11,day5) #expires是这么设置的 expires datetime.n…

Java Map 怎样实现Key 的唯一性?

大家都知道。在Map和Set不可存在反复元素&#xff1f; 可是对于内部的细节我们并不了解。今天我们就一块来 探讨一下&#xff01; 1 对于 HashMap HashSet 他们的底层数据结构的实现是&#xff1a;维护了一张 HashTable 。容器中的元素所有存储在Hashtable 中。他们再加入…

win10下安装pyspark及碰到的问题

文章目录前言安装过程Q1总结&#xff1a;前言 最近由于工作需要&#xff0c;需要了解下pyspark&#xff0c;所以就在win10环境下装了下&#xff0c;然后在pycharm中使用的时候碰到了一些问题。整个过程可谓是一波三折。下面一一道来。 安装过程 安装过程就不详细说了&#x…

解决AttributeError AttributeError: 'NoneType' object has no attribute 'filename'

原因忘记上传文件 表单需要加属性 enctype"multipart/form-data" 否则报错&#xff01;AttributeError AttributeError: NoneType object has no attribute filename enctype"multipart/form-data是设置表单的MIME编码。默认情况&#xff0c;这个编码格式是ap…

SQLAlchemy()分页器paginate方法

Flask的数据分页示例 用法&#xff1a; 1&#xff0c;首先写数据获取的视图函数&#xff0c;就像这样&#xff1a; # 首页 blog_bp.route(/, endpointindex) def index():#获取页数page request.args.get(page,1)paginate Article.query.paginate(pageint(page),per_page3)…

开源中国 2014 年源创会年度计划

时光总是从敲代码的指尖不经意地滑过&#xff0c;转眼2014年已快过去一半&#xff0c;OSC依然心怀着最初的梦想。 源创会&#xff0c;oscer的线下快乐大本营&#xff0c;我们仍在继续...... 聆听技术大牛讲解最前沿的技术&#xff0c;和同道中人切磋IT秘籍&#xff0c;吃点心侃…

互联网金融行业申请评分卡(A卡)简介

文章目录前言基本概念1、信用违约风险的基本概念什么是信用违约风险&#xff1a;组成部分违约的主体个贷中常用的违约定义M0&#xff0c;M1&#xff0c;M2的定义2、申请评分卡的重要性和特性信贷场景中的评分卡申请评分卡的概念为什么要开发申请评分卡评分卡的特性 &#xff08…

Flask的csrf_token的用法

在flask当中&#xff0c;flask-wtf模块时携带csrf校验的&#xff0c;只是需要开启&#xff1b; 如果不开启校验就不需要校验&#xff0c;但是那样不安全。 Csrf是针对与post请求的跨域限制&#xff0c;get请求没有作用 csrf_token的开启 在flask中开启csrf保护 from flask_…

dotty编译器语法特性之一交叉类型,联合类型和文本单例类型

2019独角兽企业重金招聘Python工程师标准>>> ###翻译&#xff1a;http://dotty.epfl.ch/docs/reference/intersection-types.html #交叉类型 trait Resettable {def reset(): this.type } trait Growable[T] {def add(x: T): this.type } def f(x: Resettable &…

【转】Zookeeper 安装和配置

转自&#xff1a;http://coolxing.iteye.com/blog/1871009 Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进行介绍. 单机模式 1. 配置 点击这里下载zookeeper的安装包之后, 解压到合适目录. 进入zookeeper目录下的conf子目录, 创建z…

一分钟精通Flask-Bootstrap的使用

要想在程序中集成Bootstrap&#xff0c;显然要对模板做所有必要的改动。不过&#xff0c;更简单的方法是使用一个名为Flask-Bootstrap 的Flask 扩展&#xff0c;简化集成的过程。 安装&#xff1a; Flask-Bootstrap 使用pip安装&#xff1a; pip install flask_bootstrap Fl…

linux生产环境下安装anaconda总结

前言&#xff1a; 工作中&#xff0c;常常要在新的linux生产服务器中安装自己的集成python环境&#xff0c;这种情况下有一点需要注意&#xff1a;不能覆盖生产服务器中的python环境&#xff08;也就是自己的python环境要和系统的python环境分开&#xff09;。一般情况下系统自…

Delphi TScrollBar 用于滚动窗口、组件内容

滚动条组件&#xff08;TScrollBar&#xff09;此组件是一个Windows滚动条&#xff0c;用于滚动窗口、组件内容。许多控制有滚动条属性&#xff0c;它们把滚动条作为自己的一部分&#xff0c;对于没有完整滚动条的控制&#xff0c;TScrollBar组件提供了一个附加的功能&#xff…

FSF 称 DRM 被用于锁定、控制和监视用户

自由软件基金会正在督促美国政府废除DMCA中保护DRM的反规避条款。DMCA的1201条款禁止绕过DRM保护的内容和设备。 自由软件基金会的Donald Robertson在致函美国版权办公室的信&#xff08;PDF&#xff09;中指出&#xff0c;技术保护措施和数字限制管理&#xff08;即DRM&#x…

改数据库表结构类型两种方法

alter table user change password password varchar(128) not null; alter table user modify column password varchar(128) not null;

申请评分卡(A卡)的开发过程(1)

前言&#xff1a; 本篇文章上接《申请评分卡简介》&#xff0c;有需要的童鞋可以参考下&#xff1a;https://blog.csdn.net/qq_16633405/article/details/107744921 下面介绍下A卡的开发步骤。 开发过程 1、评分卡模型开发步骤&#xff1a; 1、立项&#xff1a;场景&#…

提升你的开发效率,10 个 NPM 使用技巧

对于一个项目&#xff0c;常用的一些npm简单命令包含的功能有&#xff1a;初始化一个文件夹( npm init )&#xff0c;下载npm模块( npm install )&#xff0c;创建测试( npm test ) 和自定义脚本( npm run )。但是&#xff0c;进一步了解一些 npm 的使用技巧可以彻底改变你的日…

E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-front

解决&#xff1a; E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)&#xff0c;是否有其他进程正占用它&#xff1f; 方法&#xff1a; 重新启动虚拟机服务器 再在黑屏终端中重新尝试输入su…