简单介绍管道法:

生产者生产数据输送到管道,消费者从管道拿出数据,管道为空消费者等待,管道满生产者生产,消费者消费生产者生产,生产者生产消费者消费。

public class Corn { //要生产的产品
}
public class Buffer {
private int count=0; //产品计数器
private Corn corn[]=new Corn[10]; //缓冲区容量,缓冲区满生产等待,缓冲区空消费者等待
/*生产数据*/
public synchronized void produce(Corn corn){ //注意:wait()只能在同步块/同步方法中使用
if(count>=this.corn.length){ //缓冲区满
try { //线程等待
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.corn[count]=corn; //可以生产数据
count++;
this.notifyAll(); //通知消费
}
/*取出数据*/
public synchronized Corn getCorn(){
if(count==0){ //缓冲区空
try { //线程等待
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--; //可以取出数据
this.notifyAll(); //通知生产
return corn[count];
}
}
/**
* 生产者类
*/
public class Produce implements Runnable{
private Buffer buffer; public Produce(Buffer buffer) {
this.buffer = buffer;
} @Override
public void run() {
for (int i = 1; i <= 100; i++) {
buffer.produce(new Corn());
System.out.println("生产第"+i+"个产品");
}
}
}
/**
* 消费者类
*/
public class Customer implements Runnable {
private Buffer buffer; public Customer(Buffer buffer) {
this.buffer = buffer;
} @Override
public void run() {
for (int i = 1; i <= 100; i++) {
buffer.getCorn();
System.out.println("得到第"+i+"份产品");
}
}
}
/**
* 主类
*/
public class Test {
public static void main(String[] args) {
Buffer buffer=new Buffer();
/*开启生产者和消费者进程*/
new Thread(new Produce(buffer)).start();
new Thread(new Customer(buffer)).start();
}
}

Java多线程学习——wait方法(管道法/生产者消费者模式)的更多相关文章

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

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

  2. Java多线程使用wait和notify实现生产者消费者模型

    Java多线程使用wait和notify这两个关键字的学习,通过实现生成者与消费者来成对研究比较科学. 从两个字的意义来讲就是等待与通知这个简单道理. 现在先模拟一个缓存区存储,是用一个list实现的 ...

  3. Java 学习笔记 使用synchronized实现生产者消费者模式

    说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...

  4. Java多线程学习——wait方法(信号灯法/生产者消费者模式)

    信号灯法:以一个标志位来判断是否执行还是等待 public class TV { private String voice; //内容 private boolean flag=false; //信号 ...

  5. Java多线程学习——join方法的使用

    join在线程里面意味着“插队”,哪个线程调用join代表哪个线程插队先执行——但是插谁的队是有讲究了,不是说你可以插到队头去做第一个吃螃蟹的人,而是插到在当前运行线程的前面,比如系统目前运行线程A, ...

  6. Java 多线程学习笔记:生产者消费者问题

    前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...

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

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

  8. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  9. 2.5多线程(Java学习笔记)生产者消费者模式

    一.什么是生产者消费者模式 生产者生产数据存放在缓冲区,消费者从缓冲区拿出数据处理. 可能大家会问这样有何好处? 1.解耦 由于有了缓冲区,生产者和消费者之间不直接依赖,耦合度降低,便于程序拓展和维护 ...

随机推荐

  1. Stanford CS229 Machine Learning by Andrew Ng

    CS229 Machine Learning Stanford Course by Andrew Ng Course material, problem set Matlab code written ...

  2. c字符串函数

    1.  bcmp(3) 类ma似于strncmp(3) 但是比较结果不一定是两个字符的ascii码之差. 返回值:相等0,不相等非零(不一定是-1) 2.bcopy(3)类ma似于strncpy(3) ...

  3. Vue项目使用域名访问配置

    1. 编辑C:\Windows\System32\drivers\etc文件夹中的hosts文件,在末尾添加127.0.0.1 www.local.com(你的自定义域名) 注意:如果该文件夹没有ho ...

  4. CSS3书写规范

    css样式的书写顺序: 1.位置属性(position, top, right, z-index, display, float等) 2.大小(width, height, padding, marg ...

  5. Windows 7、Windows XP SP3关闭DEP堆栈执行保护

    Windows XP SP3 在Windows XP SP3中,关闭DEP的方法是: 编辑C:\boot.ini,你大概会看到如下内容 [boot loader] timeout=30 default ...

  6. 判断request中是否有文件

    ServletFileUpload.isMultipartContent(request)

  7. JDBC与Hibernate的区别

    相同点: ◆两者都是JAVA的数据库操作中间件. ◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭. ◆两者都可以对数据库的更新操作进行显式的事务处理. 不同点: ◆使用的SQL语言 ...

  8. 部署jumpserver

    参考:https://jumpserver.readthedocs.io/zh/master/setup_by_centos7.html yum update -y systemctl start f ...

  9. K8S in Action

    1,容器的概念 镜像 镜像仓库 容器 镜像层:Docker镜像由多层构成.好处:网络分发效率,减少镜像的存储空间 1.2 k8s 主节点 ,它承载着 Kubernetes 控制和管理整个集群系统的控制 ...

  10. SSM整合之---简单选课系统

    简单选课系统 一.实体图 二.功能 三.代码实现 1.SSM环境搭建 (1)pom.xml <dependencies> <dependency> <groupId> ...