模型描述:
java线程中典型的生产者与消费者模式,综合运用到thread中的notify()和wait();
仓库Godown的固定的容量大小max_size,同时有多个生产者向仓库生产放他产品,同时又有多个消费都从仓库取出产品,这就涉及到生产和消费过程中的同步问题,利用多线程技术可以很好的解决这个问题
1、生产者模型,定义为一个线程即实现Thread类
package com.leiht.thread.waitnotify;
public class Producer extends Thread {
private int needNum;
private Godown godown;
public Producer(int needNum, Godown godown) {
this.needNum = needNum;
this.godown = godown;
}
@Override
public void run() {
godown.produce(needNum);
}
public int getNeedNum() {
return needNum;
}
public void setNeedNum(int needNum) {
this.needNum = needNum;
}
public Godown getGodown() {
return godown;
}
public void setGodown(Godown godown) {
this.godown = godown;
}
}
2、消费模型
package com.leiht.thread.waitnotify;
public class Consumer extends Thread {
private int needNum;
private Godown godown;
public Consumer(int needNum, Godown godown) {
this.needNum = needNum;
this.godown = godown;
}
@Override
public void run() {
godown.consume(needNum);
}
public int getNeedNum() {
return needNum;
}
public void setNeedNum(int needNum) {
this.needNum = needNum;
}
public Godown getGodown() {
return godown;
}
public void setGodown(Godown godown) {
this.godown = godown;
}
}
仓库模型(核心代码)
package com.leiht.thread.waitnotify;
public class Godown {
public int current_size;
public static final int max_size = 100;
public static int getMaxSize() {
return max_size;
}
public Godown(int current_size) {
this.current_size = current_size;
}
/*
* 生产方法
*/
public synchronized void produce(int needNum) {
//可以生产
if((needNum + current_size) < max_size) {
System.out.println("开始生产");
current_size = current_size + needNum;
System.out.println("生产完成");
notifyAll();
}else { //不能生产 将当前线程挂到this(当前)对象上
try {
System.out.println("当前库存过大,挂起等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
* 消费方法
*/
public synchronized void consume(int needNum) {
if(needNum > current_size) {
try {
System.out.println("当前商品不足,等等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("开始消费");
current_size = current_size - needNum;
System.out.println("结束消费");
notifyAll();
}
}
测试代码
package com.leiht.thread.waitnotify;
public class Test {
public static void main(String[] args) {
Godown godown = new Godown(30);
Consumer c1 = new Consumer(50, godown);
Consumer c2 = new Consumer(20, godown);
Consumer c3 = new Consumer(30, godown);
Producer p1 = new Producer(10, godown);
Producer p2 = new Producer(10, godown);
Producer p3 = new Producer(10, godown);
Producer p4 = new Producer(10, godown);
Producer p5 = new Producer(10, godown);
Producer p6 = new Producer(10, godown);
Producer p7 = new Producer(80, godown);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
分享到:
相关推荐
java多线程实现生产者和消费者
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
java 多线程 生产者消费者模式,你值得拥有
生产者消费者模式是java多线程经典的安全,它用到了同步,资源共享,wait,notify等技术。
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...
NULL 博文链接:https://hbkh2000.iteye.com/blog/378843
java多线程之消费者生产者模式参照.pdf
java多线程之消费者生产者模式.pdf
主要介绍了Java多线程生产者消费者模式实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java写的消费者生产者模式,主要用到线程同步、线程等待和线程唤醒
生产者/消费者问题的多种Java实现方式。采用适配器模式架构完成三种方式的实现。demo清晰明了
NULL 博文链接:https://ruyi574812039.iteye.com/blog/2097988
基于队列实现的生产消费者模式java 源码,并且采用多线程进行消费
生产者-消费者 设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者模式 单例模式 结构型模式 队列模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 行为...
Java JDK1.5后新特性,用Lock和Condtion对象解决线程安全问题,提高了效率。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java多线程设计模式详解,包括了单线程,生产者和消费者,各种线程方法的解释!
主要介绍了Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解,具有一定参考价值,需要的朋友可以了解下。
一、重点知识 isDaemon 判断是否为守护线程。 run方法是不能用synchronized修饰,他是继承来的,不能改变其结构,...stringBuffer中的同步方法,都是非静态的,因为共用一个this锁就可以了,线程进去调用他的一个方法