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包中的阻塞队列来实现.在看完后 ...
随机推荐
- JS实现rgb与16进制颜色相互转换
1.rgb转16进制 function to16 (a) {//RGB(204,204,024) //十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-f]{3}|[0-9a- ...
- linux x64下编译libjpeg,libpng,zlib
libJpeg编译: 下载libjpeg源码:http://www.ijg.org/,下载jpegsrc.v9a.tar.gz 解压源码,命令:tar -zxvf jpegsrc.v9a,源码文件夹为 ...
- oracle 11g卸载方法
在网上查看了很多卸载oracle11g的方法,但是感觉都太复杂了,没有使用,最后查看了很多资料,得到一种比较简单,而且能完全卸载的方法: 在根目录下运行c:\app\Administrator\pro ...
- java内存
java内存分为四部分: 1).栈区(stacksegment),由编译器自动分配释放,存放函数的参数值和局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源: 2).堆区(heapseg ...
- Object-C属性(Properties)
前面我们写了caption和photographer的访问方法,你可能也注意到了,那些代码很简单,应该可以写成具有更普遍意义的形式. 属性是Object-C的一个特性,它允许我们自动生成访问器,同时还 ...
- 类库探源——System.Drawing.Bitmap
一.System.Drawing.Bitmap Bitmap 类: 封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素定义的图像的对象 命名空间: System ...
- 记一次ftp服务器错误 centOS 6.4 vsftpd 500 illegal port command
这个错误是因为是主动模式的,应该改为被动模式 以下是操作过程: iptables中加 -A INPUT -p tcp -m state --state NEW -m tcp --dport 10221 ...
- IIS原理学习
IIS 原理学习 首先声明以下内容是我在网上搜索后整理的,在此只是进行记录,以备往后查阅只用. IIS 5.x介绍 IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Appl ...
- 程序员的编辑器——VIM
from:http://blog.chinaunix.net/uid-11278770-id-148579.html Chinaunix首页 | 论坛 | 认证专区 | 博客 登录 | 注册 ...
- Netty源码阅读(一) ServerBootstrap启动
Netty源码阅读(一) ServerBootstrap启动 转自我的Github Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速 ...