概述

在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法。

wait() / notify()方法

await() / signal()方法

BlockingQueue阻塞队列方法

PipedInputStream / PipedOutputStream

wait() / notify()方法

public class Storage {

    private final int MAX_SIZE = 100;
private LinkedList<Object> list = new LinkedList<>(); private synchronized void produce(String producer) {
while (list.size() >= MAX_SIZE) {
System.out.println("仓库已满,【" + producer + "】: 暂时不能执行生产任务!");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(new Object());
this.notifyAll();
} private synchronized void consume(String consumer) {
while (list.size() == 0) {
System.out.println("仓库已空,【" + consumer + "】: 暂时不能执行消费任务!");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.remove();
this.notifyAll();
}
} public class Producer extends Thread {
private String producer;
private Storage storage; public Producer(Storage storage) {
this.storage = storage;
} @Override
public void run() {
while (true) {
produce(producer);
}
} public void produce(String producer) {
storage.produce(producer);
} public String getProducer() {
return producer;
} public void setProducer(String producer) {
this.producer = producer;
} public Storage getStorage() {
return storage;
} public void setStorage(Storage storage) {
this.storage = storage;
}
} public class Consumer extends Thread {
private String consumer;
private Storage storage; public Consumer(Storage storage) {
this.storage = storage;
} @Override
public void run() {
while (true) {
consume(consumer);
}
} public void consume(String consumer) {
storage.consume(consumer);
} public Storage getStorage() {
return storage;
} public void setStorage(Storage storage) {
this.storage = storage;
} public String getConsumer() {
return consumer;
} public void setConsumer(String consumer) {
this.consumer = consumer;
}
}

await() / signal()方法

public class StorageLock {
private Lock lock = new ReentrantLock();
private Condition fullCondition = lock.newCondition();
private Condition emptyCondition = lock.newCondition(); private final int MAX_SIZE = 10; private LinkedList<Object> list = new LinkedList<>(); public void produce(String name) {
try {
lock.lock();
while (list.size() == MAX_SIZE) {
fullCondition.await();
System.out.println("仓库已满," + name + "暂停生产");
}
list.add(new Object());
System.out.println(name + "生产一个,当前仓库容量" + list.size());
emptyCondition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} public void consume(String name) {
try {
lock.lock();
while (list.size() == 0) {
emptyCondition.await();
System.out.println("仓库以空," + name + "暂停消费");
}
list.remove();
System.out.println(name + "消费一个,当前仓库容量" + list.size());
fullCondition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}

BlockingQueue阻塞队列方法


public class BlockStorage {
private final int MAX_SIZE = 10;
private ArrayBlockingQueue<Object> list = new ArrayBlockingQueue<Object>(MAX_SIZE); public void produce(String name) throws InterruptedException {
if(list.size() == MAX_SIZE){
System.out.println("仓库已满,【" + name + "】: 暂时不能执行生产任务!");
}
list.put(new Object()); System.out.println("【" + name + "】:生产了一个产品\t【现仓储量为】:" + list.size());
} public void consume(String name) throws InterruptedException {
if(list.size() == 0){
System.out.println("仓库空,【" + name + "】: 暂时不能执行消费任务!");
}
list.take(); System.out.println("【" + name + "】:消费了一个产品\t【现仓储量为】:" + list.size());
} }

java-线程-生产者-消费者的更多相关文章

  1. java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 解说演示样例 --thinking java4

    package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import jav ...

  2. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  3. Java基础 线程的通信的三个方法/ 交替数数线程 / 生产者&消费者线程问题

    线程通讯笔记: /** 线程通信 三个方法: * wait(): 调用该方法 是该调用的方法的线程释放共享资源的锁,进入等待状态,直至被唤醒 * notify() : 可以唤醒队列中的第一个等待同一共 ...

  4. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

  5. Java-J2SE学习笔记-线程-生产者消费者问题

    一.概述 模拟生产者消费者问题 二.代码 1.Consumer.java 2.Producer.java 3.SyncStack.java 4.Test.java 1.Consumer.java pa ...

  6. java实现生产者消费者问题

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  7. Java实现生产者消费者

    方法1:最简单--利用LinkedBlockingQueue 队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构. 1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点. —— ...

  8. java实现生产者消费者问题(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  9. [转载] Java实现生产者消费者问题

    转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...

  10. java实现生产者消费者模式

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...

随机推荐

  1. PatentTips - Resource partitioning and direct access utilizing hardware support for virtualization

    BACKGROUND The present disclosure relates to the resource management of virtual machine(s) using har ...

  2. jquery 获取上一个兄弟元素和下一个兄弟元素

    jQuery.prev(),返回上一个兄弟节点,不是所有的兄弟节点 jQuery.prevAll(),返回所有之前的兄弟节点 jQuery.next(),返回下一个兄弟节点,不是所有的兄弟节点 jQu ...

  3. jmeter--响应断言

    背景 在测试过程中,我们需要对某个请求的结果进行判定. 比如我们搜索“你好”,请求发送成功,返回响应码也是200,但是并不能说明返回的响应就是对的,我们可能还需要判定响应结果包含“你好”.这个时候,我 ...

  4. 为什么我要选择erlang+go进行server架构(2)

    原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface 为什么我要选择Erlang呢? 一.erlang特别适合中小团队创业: erl ...

  5. docker 第一课 —— 从容器到 docker

    1. 容器的概念 一种虚拟化的解决方案 与虚拟机所不同的是,虚拟机通过中间层,将一台或多台独立的机器虚拟运行于物理硬件之上: 而容器是直接运行于操作系统内核之上的用户空间: 基于上述,容器虚拟化也被称 ...

  6. linux目录架构及常用的基本命令

    linux目录架构 /   根目录 /bin    常用的命令 binary file 的目錄 /boot   存放系统启动时必须读取的档案,包括核心 (kernel) 在内      /boot/g ...

  7. Ansible 部署

    环境: vim /etc/hosts 192.168.199.61 Ansible 192.168.199.60 Nginx1192.168.199.62 Nginx2192.168.199.63 H ...

  8. (转)Vim练级攻略

    (转)Vim练级攻略 原文链接:http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆 ...

  9. 英特尔投资:7200万美元投资12家创新公司,包括3家中国公司(www.intelcapital.com)

    集微网消息,英特尔投资——英特尔公司全球投资机构,今天在英特尔投资全球峰会上宣布向12家科技创业公司投资超过7200万美元.加上今天宣布的新投资,英特尔投资在2018年投资总额已超过1.15亿美元. ...

  10. swift学习第十天:函数

    函数的介绍 函数相当于OC中的方法 函数的格式如下 func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值 } func是关键字,多个参数列表之间可以用逗号(,)分隔, ...