用 wait-notify 解决生产者-消费者问题
- //生产者
package com.mzj.test;- import java.util.Vector;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- public class Producer implements Runnable {
- private final Vector sharedQueue;
- private final int SIZE;
- public Producer(Vector sharedQueue, int size) {
- this.sharedQueue = sharedQueue;
- this.SIZE = size;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- for (int i = 0; i < 7; i++) {
- System.out.println("Produced:" + i);
- try {
- produce(i);
- } catch (InterruptedException ex) {
- Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- }
- private void produce(int i) throws InterruptedException {
- //wait if queue is full
- while (sharedQueue.size() == SIZE) {
- synchronized (sharedQueue) {
- System.out.println("Queue is full " + Thread.currentThread().getName()
- + " is waiting , size: " + sharedQueue.size());
- sharedQueue.wait();
- }
- }
- //producing element and notify consumers
- synchronized (sharedQueue) {
- sharedQueue.add(i);
- sharedQueue.notifyAll();
- }
- }
- }
消费者
- package com.mzj.test;
- import java.util.Vector;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- public class Consumer implements Runnable {
- private final Vector sharedQueue;
- private final int SIZE;
- public Consumer(Vector sharedQueue, int size) {
- this.sharedQueue = sharedQueue;
- this.SIZE = size;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while (true) {
- try {
- System.out.println("Consumer: " + consume());
- Thread.sleep(50);
- } catch (InterruptedException ex) {
- Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- }
- private int consume() throws InterruptedException {
- //wait if queue is empty
- while (sharedQueue.isEmpty()) {
- synchronized (sharedQueue) {
- System.out.println("Queue is empty " + Thread.currentThread().getName()
- + " is waiting , size: " + sharedQueue.size());
- sharedQueue.wait();
- }
- }
- //otherwise consume element and notify waiting producer
- synchronized (sharedQueue) {
- sharedQueue.notifyAll();
- return (Integer) sharedQueue.remove(0);
- }
- }
- }
测试
- package com.mzj.test;
- import java.util.Vector;
- public class ProducerConsumerSolution {
- public static void main(String[] args) {
- Vector sharedQueue = new Vector();
- int size = 4;
- Thread prodThread = new Thread(new Producer(sharedQueue, size), "Producer");
- Thread consThread = new Thread(new Consumer(sharedQueue, size), "Consumer");
- prodThread.start();
- consThread.start();
- }
- }
用 wait-notify 解决生产者-消费者问题的更多相关文章
- java多线程15 :wait()和notify() 的生产者/消费者模式
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- Java如何使用线程解决生产者消费者问题?
在Java编程中,如何使用线程解决生产者消费者问题? 以下示例演示如何使用线程解决生产者消费者问题. package com.yiibai; public class ProducerConsumer ...
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.htm ...
- java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- java使用synchronized与Semaphore解决生产者消费者问题对比
一.synchronized与信号量Semaphore简介 1.synchronized是java中的关键字,是用来控制线程同步的问题最常用的方法. 2.Semaphore是属于java的一个类,同样 ...
- 多线程-4.wait() notify() notifyAll() 生产者消费者模型
1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...
- 基于java callable及future接口解决生产者消费者问题
这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者- ...
- Java 管程解决生产者消费者问题
同样是实验存档.//.. 依然以生产者消费者问题作为背景. 管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就 ok,不用去考虑进程同步的问题. 管程: packag ...
- Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...
随机推荐
- Jquery ajax动态更新下拉列表的内容
$("#book_id").change(function(){ $book_id=$(this).children('option:selected').val(); //ale ...
- MYSQL连接相关参数和状态值详解
针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_ ...
- centOS 7 简单设置(虚拟机)
1.修改主机名 hostnamectl set-hostname 2.ssh连接慢的问题解决 vim /etc/ssh/sshd_config UseDNS=no GSSAPIAuthenticati ...
- C#中的多线程 - 高级多线程 z
原文:http://www.albahari.com/threading/part4.aspx 专题:C#中的多线程 1非阻塞同步Permalink 之前,我们描述了即使是很简单的赋值或更新一个字段也 ...
- Yii2用Gii自动生成Module+Model+CRUD
1. 开启gii模块 common/config/main-local.php加入下面代码 return [ 'modules' => [ 'gii' => [ 'class' => ...
- 全链路实践Spring Cloud 微服务架构
Spring Cloud 微服务架构全链路实践Spring Cloud 微服务架构全链路实践 阅读目录: 网关请求流程 Eureka 服务治理 Config 配置中心 Hystrix 监控 服务调用链 ...
- background-color和background-image相关细节
1.background-color 是以border-box作为他的左上角来定位的 2.background-image 默认是以padding-box作为他的左上角来定位的 3.backgroun ...
- Angular4.0--创建类实例
src/app/hero.ts文件: export class Hero { constructor( public id: number, public name: string) { } } sr ...
- 理解Underscore的设计架构
在一个多月的毕业设计之后,我再次开始了Underscore的源码阅读学习,断断续续也写了好些篇文章了,基本把一些比较重要的或者个人认为有营养的函数都解读了一遍,所以现在学习一下Underscore的整 ...
- MySQL语法三:数据控制语句
数据控制语句MCL(GRANT,REVOKE,COMMIT,ROLLBACK)