java多线程-消费者和生产者模式
/*
* 多线程-消费者和生产者模式
* 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象
* */
/*资源类中定义了name(名字):用来区分消费者还是生产者
* 定义了flag标记:用来区分有没有货物(默认生产一个就要消费一个)
* 定义了count(生产的个数统计)
* set方法:用来生产商品
* out方法:用来消费商品*/
class TestSource{
private String name=null;
private boolean flag=false;
private int count=0;
/*先通过flag标记判断有没有商品,有商品则等待,没有则生产商品,唤醒所有程序,并将flag标记改变*/
public synchronized void set(String name){
//判断是否有产品,这里用while循环,避免在多个生产者同时生产时,会出现生产多个产品,却只消费一个
while(flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//生产产品并输出
this.name=name+"编号"+count++;
System.out.println("生产"+name+"++");
//改变标记
flag=true;
//唤醒所有的线程
notifyAll();
}
public synchronized void out(){
while(!flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费"+name+"---");
flag=false;
notifyAll();
}
}
class Product implements Runnable{
private TestSource ts=null;
//初始化线程里用到的资源
public Product(TestSource ts){
this.ts=ts;
}
//重写线程里run方法
public void run() {
while(true){
ts.set("生产产品");
}
}
}
class Customer implements Runnable{
private TestSource ts=null;
public Customer(TestSource ts){
this.ts=ts;
}
public void run() {
while(true){
ts.out();
}
}
}
public class test {
public static void main(String[] args) {
//初始化唯一的资源
TestSource ts=new TestSource();
//创建生产者和消费者两个对象,并传入两者共同操作的唯一资源
Customer cu=new Customer(ts);
Product pr=new Product(ts);
//将对象传入线程对象
Thread t1=new Thread(cu);
Thread t2=new Thread(pr);
Thread t3=new Thread(cu);
Thread t4=new Thread(pr);
//开启线程
t1.start();
t2.start();
t3.start();
t4.start();
}
}
/*在java1.5版本以后,用lock和unlick代替了synchronized关键字
* 用await()代替了wait()方法
* 用signal()代替了notify()
* 这里的signal可以指定唤醒莫一类的线程,而不是像notifyAll,必须全部唤醒
这里我们对上面的代码进行一定的改写*/
class TestSource{
private String name=null;
private boolean flag=false;
private int count=0;
//定义lock,用来代替synchronized关键字
private Lock lock=new ReentrantLock();
private Condition condition_pro=lock.newCondition();
private Condition condition_con=lock.newCondition();
public void set(String name){
//对代码段进行上锁
lock.lock();
try {
while(flag){
try {
//wait();
//调用生产者控制方法
condition_pro.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.name=name+"编号"+count++;
System.out.println("生产"+name+"++");
flag=true;
//notifyAll();
//唤醒消费者线程
condition_con.signal();
} finally{
//解锁,让其他进程进入访问
lock.unlock();
}
}
public void out(){
lock.lock();
try{
while(!flag){
try {
//wait();
condition_con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费"+name+"---");
flag=false;
//notifyAll();
condition_pro.signal();
}finally{
lock.unlock();
}
}
}
java多线程-消费者和生产者模式的更多相关文章
- Java多线程消费者、生产者的基本思路
多线程主要考察的就是 线程的同步控制 生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了 ThreadOne.ThreadTwo同时运行,添加一个变量在一个公共类(下边的Funct ...
- java并发:初探消费者和生产者模式
消费者和生产者模式 用继承Thread方式,用wait和notifyAll方法实现. 消费者和生产者模式的特点 1. 什么时候生产:仓库没有满的时候,生产者这可以生产,消费者也可以消费,仓库满的时候停 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格)
一.springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格) 1.实现简单的消费者和生产者 springcloud使用的http协议进行传输数据,也就是说springclo ...
- java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现
java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了 wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...
- JAVA多线程经典问题 -- 生产者 消费者
工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...
- Java多线程-并发协作(生产者消费者模型)
对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓 ...
- Java多线程与并发——生产者与消费者应用案例
多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Admin ...
随机推荐
- ajax 实现页面加载和内容的删除
ajax最大的好处就在于加载和删除的时候不会跳转页面,现在的网页大多都会选择用ajax来写,相比嵌入PHP代码来说减少了代码量,同时加载页面也会比较快, 下面是用ajax以数据库fruit表为例写的 ...
- 面向对象的全套“企业微信”api接口的代码实现,网上太多“面向过程”微信api接口的代码,这个开源给需要的人用
有段时间没有写文章了. 一直以来,微信的热门是看得到的,很多人都需要与微信的api对接. 今天我这里就分享全套的企业微信api接口的代码. 关于微信api,网上已经有很多实现的了. 但是我今天之所以还 ...
- python + selenium <三>
sql 数据库连接 引用pymssql模块 import pymssqldef getDB(name,psw,dbname,sql): conn=pymssql.connect(HOST=host,N ...
- LINQ笔记
LINQ概述 语言集成查询(Language intergrated Query,LINQ)在C#编程语言中集成了查询语法. 可以使用相同的语法访问不同的数据源 提供了不同数据源的抽象层,所有可以使用 ...
- 【转】深入理解RunLoop
RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...
- 使用Android Studio导入第三方库项目
在使用Android Studio开发时,用到了第三方库SlidingMenu(现在已经不推荐使用了),尽管如此,但具体怎么导入第三方库还是需要知道的,在查阅各种资料后,知道了一种比较容易可行的方法 ...
- iOS开发之Autolayout
1.概述 在以前的iOS程序中,是如何设置布局UI界面的? (1)经常编写大量的坐标计算代码 (2)为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还需要分别为2种屏幕 ...
- iOSiOS开发之数据存储之NSKeyedArchiver
1.概述 NSKeyedArchiver归档和plist文件存储不同的是NSKeyedArchiver可以直接保存对象.如果对象是NSString.NSDictionary.NSArray.NSDat ...
- 解决VIM编辑器中文乱码
追加如下内容到/etc/vimr (或者不同的用户家目录下的.vimrc文件中) set encoding=utf8filetype plugin indent onsyntax on" s ...
- Java变量和对象的作用域
大多数程序设计语言都提供了"作用域"(Scope)的概念. 对于在作用域里定义的名字,作用域同时决定了它的"可见性"以及"存在时间".在C, ...