java学习多线程之生产者消费者
在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系。那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三、李四负责生产烤鸭,王五、马六负责吃烤鸭,那么前者生产完烤鸭之后,如果烤鸭没有被吃完的话,这个时候就不再生产了,如果此时烤鸭吃没了,这个时候消费者就要告诉生产者,烤鸭吃没了,你要继续生产烤鸭,否则生产者一直处于等待的状态。
如何来用代码体现呢?
1、定义两个类,一个是生产者类 Product 一个是消费者类Consume,两个类分别实现Runnable中的run方法。
2、Product当中的run方法的任务就是生产烤鸭,Consume当中的run方法中就负责吃烤鸭,同时在生产完烤鸭之后,生产者就要等待,等待消费者吃完了之后就告知生产者,同理生产者生产出烤鸭之后就会告知消费者,这期间就有一个消息的传递。
在多线程当中为了让运行的线程之间能够相互通信,这个时候java提供给了我们wait()方法还有notify()方法,这两个方法的作用是,一旦wait()这个时候就释放了cup的执行权,还有执行资格,进入了冻结的状态。notify()方法却恰恰相反,他的作用是让wait()苏醒,这个时候重新拥有执行权还有执行资格。那么这两个方法是针对谁来说的呢,这个两个方法是针对锁来说的。多线程之间为什么要通信,因为有了共性的部分需要协调处理,这个时候需要通信。既然有了共同的部分这个时候,为了保证线程的安全,这个时候必然会引入一个锁来保证线程的安全,各个线程之间通过这个锁来约束,共性的部分。所以靠锁来完成进程当中的相互通信,是可靠的。
我们用代码来体现一下:
class KaoYa
{ int num = ; boolean flag; Object obj = new Object(); public void produce()
{ synchronized (obj)
{
while(true)
{
try{
while(flag)
obj.wait();
System.out.println(Thread.currentThread().getName()+"KaoYa...."+num);
flag = true;
obj.notify();
//num++; }catch(InterruptedException e)
{ }
} } } public void consume()
{
synchronized(obj)
{
while(true)
{
try{
while(!flag)
obj.wait();
System.out.println(Thread.currentThread().getName()+"KaoYa------"+num);
num++;
flag = false;
obj.notify(); }catch(InterruptedException e)
{ }
} } } } class Product implements Runnable
{ KaoYa k;
Product(KaoYa k)
{ this.k = k; } public void run()
{ k.produce(); } } class Consume implements Runnable
{ KaoYa k;
Consume(KaoYa k)
{ this.k = k; } public void run()
{ k.consume(); } } class ProCon
{ public static void main(String[] args) { KaoYa k = new KaoYa();
Product p = new Product(k);
Consume c = new Consume(k); Thread t1 = new Thread(p);
Thread t2 = new Thread(c); t1.start();
t2.start(); } }
java学习多线程之生产者消费者的更多相关文章
- 2.5多线程(Java学习笔记)生产者消费者模式
一.什么是生产者消费者模式 生产者生产数据存放在缓冲区,消费者从缓冲区拿出数据处理. 可能大家会问这样有何好处? 1.解耦 由于有了缓冲区,生产者和消费者之间不直接依赖,耦合度降低,便于程序拓展和维护 ...
- 【java】多线程同步生产者消费者问题
package 多线程; class Producer implements Runnable{ private Data data; public Producer(Data data){ this ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
- Java多线程_生产者消费者模式2
在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...
- 【多线程】--生产者消费者模式--Lock版本
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...
- 使用Java的BlockingQueue实现生产者-消费者
http://tonl.iteye.com/blog/1936391 使用Java的BlockingQueue实现生产者-消费者 博客分类: Java JavaBlockingQueue阻塞队列 B ...
- Android-Java多线程通讯(生产者 消费者)&10条线程对-等待唤醒/机制的管理
上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客A ...
- Java 多线程学习笔记:生产者消费者问题
前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...
随机推荐
- Come and join us at English corner
2012.12.26 Hi all, How are you doing? Merry post-Christmas and happy upcoming New year!! I wish you ...
- Spring中整合Titles
在<Spriing实战(第三版)>这本书中,有一个使用titles的例子,但是这是一个不完整的例子.那么要参照起来就比较难了,于是找到了下面这篇博客. 在Spring中使用tiles2 ( ...
- IOS_视图实现圆角效果的三种方法及比较
通过代码,至少有三种方法可以为视图加上圆角效果.附例子:https://github.com/weipin/RoundedCorner 方法一.layer.cornerRadius 第一种方法最简单, ...
- 数据操作So easy-LINQ解析
1.LINQ是什么? LINQ是Language Integrated Query的缩写,即“语言集成查询”的意思.LINQ的提出就是为了提供一种跨越各种数据源的统一的查询方式,它主要包含4个组件-- ...
- mysql笔记之集群
1.主从配置 #主从都要加入以下配置如下 [mysqld] log-bin=mysql-bin #主从要不一样 server-id=222 #在主上建立一个用户给从的用 GRANT REPLICATI ...
- Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出
Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...
- jQuery动态效果实例
jQuery常见的动态效果: 隐藏/显示效果: 1.(1):隐藏,显示:通过 jQuery,使用 hide() 和 show() 方法可以用来隐藏和显示 HTML 元素. (2):隐藏/显示的速度: ...
- SGU 218.Unstable Systems
题意: 有n(n<500)台机器,和500个程序.不同的程序在不同的机器上运行有着不同的不稳定度s[i][j].求最小的最大稳定度及其方案. Solution: 比较经典的二分图模型. 建图很简 ...
- 在Apache下开启SSI配置支持include shtml html和快速配置服务器
作为前端开发,使用Apache快速搭建服务器极为方便. 1.找到apach安装目录,找到conf目录下 的httpd.conf 使用SSI(Server Side Include)的html文件扩展名 ...
- 【java版坦克大战---准备篇】 java 绘图
要写坦克大战当然要先画出坦克.java画图是基础. package com.game; import java.awt.*; import javax.swing.*; public class Pr ...