在实现生产者消费者模式之前,我们先了解一下线程的5种状态:被创建、运行、冻结、消亡、阻塞,如下图:

在Jdk1.5发布之前,我们实现生产者消费者模式一般使用synchronized + while循环实现。

下面就这一方法,围绕一个小需求,进行代码实现:

package com.shindo.java.thread;
/**
* 需求:生产者生产一个商品,消费者消费一个商品
*/ public class ProducerAndConsumerPattern {
public static void main(String[] args){
Resource r = new Resource();
//定义两个线程同时运行:一个负责生产商品,一个负责消费商品
new Thread(new Producer(r)).start();
new Thread(new Consumer(r)).start(); }
} /**
* 定义资源
*/
class Resource{
//定义需要打印的商品名称
private String name;
//定义自增长变量
private int count = 1;
//定义逻辑判断标签
private boolean flag = false; public synchronized void set(String name){
//若flag标志位为true,当前线程进入冻结状态
while(flag)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} //打印当前生产的商品名字
this.name = name + "--" + count++;
System.out.println(Thread.currentThread().getName()+"--生产者--"+this.name);
//生产商品后,改变标志位,为消费者做准备
flag = true;
//唤醒冻结线程:改方法会唤醒包括己方、对方线程在内的所有线程
this.notifyAll();
} public synchronized void out(){
//当flag标志位为false时,当前线程进入冻结状态
while(!flag)
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
} //打印当前消费的商品
System.out.println(Thread.currentThread().getName()+"--&&消费者&&--"+ this.name); //消费商品后,改变标志位状态,为生产者做准备
flag = false;
//唤醒所有冻结线程
this.notifyAll();
}
} /**
* 定义生产者
*/
class Producer implements Runnable{
private Resource res;
Producer(Resource res){
this.res = res;
}
public void run(){
while(true){
res.set("*商品*");
}
}
} /**
* 定义消费者
*/
class Consumer implements Runnable{
private Resource res;
Consumer(Resource res){
this.res = res;
}
public void run(){
while(true){
res.out();
}
}
}

代码运行效果如下,实现了一个线程负责生产商品,另一个线程负责消费商品:

【多线程】--生产者消费者模式--synchronized版本的更多相关文章

  1. 【多线程】--生产者消费者模式--Lock版本

    在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...

  2. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  3. Java实现多线程生产者消费者模式的两种方法

    生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...

  4. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  5. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

  6. 多线程-生产者消费者(synchronized同步)

    正解博客:https://blog.csdn.net/u011863767/article/details/59731447 永远在循环(loop)里调用 wait 和 notify,不是在 If 语 ...

  7. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  8. java多线程系列15 设计模式 生产者 - 消费者模式

    生产者-消费者 生产者消费者模式是一个非常经典的多线程模式,比如我们用到的Mq就是其中一种具体实现 在该模式中 通常会有2类线程,消费者线程和生产者线程 生产者提交用户请求 消费者负责处理生产者提交的 ...

  9. Java多线程-----实现生产者消费者模式的几种方式

       1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...

随机推荐

  1. Django之CSRF 跨站请求伪造

    一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...

  2. 理解JavaScript 的原型属性

    1.原型继承 面向对象编程可以通过很多途径实现.其他的语言,比如 Java,使用基于类的模型实现: 类及对象实例区别对待.但在 JavaScript 中没有类的概念,取而代之的是一切皆对象.JavaS ...

  3. Linq 关键字

    from var lowNums = from num in numbers            where num < 5            select num; numbers 是数 ...

  4. 网站飘窗js代码

    <SCRIPT> var imagepath="/${res}/images/geren.jpg" ; var imagewidth=178 ;//这两行写图片的大小 ...

  5. 编译XSIP过程中环境配置

    昨天在编译XSip的过程中,有很多问题首先是出现了很多的error C1083. 然后到XSIP自己的文件夹中,也找不到对应的.h文件. 上网查阅后发现应该是缺少了对应的头文件的路径.   于是到可以 ...

  6. JMS-activeMQ

    参考资料: http://yuxisanren.iteye.com/blog/1912587 .JMS简介:JMS即Java Message Service,是Java 程序创建.发送.接收和读取企业 ...

  7. python视频教程大全集下载

    python3英文视频教程(全87集) http://pan.baidu.com/s/1dDnGBvV Python从入门到精通视频(全60集)链接:http://pan.baidu.com/s/1e ...

  8. Hdu1093

    #include <stdio.h> int main() { int T,n; ; while(scanf("%d",&T)!=EOF){ while(sca ...

  9. Effective Java2读书笔记-对于所有对象都通用的方法(二)

    第10条:始终要覆盖toString 这一条没什么好讲的,就是说默认的toString方法打印出来的是类名+@+十六进制哈希码的值.我们应该覆盖它,使它能够展示出一些更为详细清晰的信息,这个看实际情况 ...

  10. try...catch...finally中try块发生的事件顺序

    1.try块在发生异常的地方中断程序的执行.2.如果有catch块,就检查该块是否匹配已抛出的异常类型.如果没有catch块,就执行finally块(如果没有catch块,就一定要有finally块) ...