java多线程中的等待唤醒机制--多生产者多消费者问题
来源:互联网 发布:洛奇英雄传单机版淘宝 编辑:程序博客网 时间:2024/05/16 23:10
在java多线程中,等待唤醒机制是最经典的也是最能够体现java多线程中的线程安全的问题,在写等待唤醒机制的时候,我们要先去了解什么是等待唤醒机制
等待唤醒机制就是指在多个线程进行并发的去操作同一个资源的问题,
以生产馒头和消费馒头举例;就比如我们有一个容器(resource,代表的是馒头的存放),这里面设置的是两个变量,i(表示的是馒头的数量)和name(表示的是馒头这个名字),线程0和线程1是生产馒头的线程,线程2和线程3是消费馒头的线程。在线程0或线程1进行生产馒头之后,线程2或者线程3就接着去消费这个馒头
由上图可知,在生产者消费者中,我们要去定义一个公共的资源,Resource,这四个线程都去共享这个资源。
代码如下
package java多线程;/* * java的等待/唤醒机制 * 生产者/消费者的问题:多生产者多消费者的问题 *///定义的是资源class AResource { private String name; private int count = 1; private boolean flag = false; public synchronized void set1(String name) { while (flag) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.name = name; count++; flag = true; notifyAll(); System.out.println(Thread.currentThread().getName() + "....生产者..." + this.name + this.count); } public synchronized void eat() { // while是解决每一次启动线程都要去判断标记的方式 while (!flag) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + "....消费者..." + this.count); flag = false; notifyAll(); // 这个方法是为了方式线程死锁的问题 }}// 定义生产者class Producer implements Runnable { private AResource ar; public Producer(AResource ar) { this.ar = ar; } @Override public void run() { // TODO Auto-generated method stub while (true) { ar.set1("馒头"); } }}// 定义消费者class Consumer implements Runnable { private AResource ar; public Consumer(AResource ar) { // TODO Auto-generated constructor stub this.ar = ar; } @Override public void run() { // TODO Auto-generated method stub while (true) { ar.eat(); } }}public class ProducerConsumerExample { public static void main(String[] args) { AResource ar = new AResource(); // 这个表示的是生产者的任务 Producer pr = new Producer(ar); // 这个表示的是消费者的任务 Consumer con = new Consumer(ar); new Thread(pr).start(); new Thread(pr).start();// 两个生产者的线程,其实是一个生产者的任务 new Thread(con).start(); new Thread(con).start();// 两个消费者的线程,其实是一个消费者的任务 }}
总结:好好的复习自己基础是很重要的啊,基础就是技术的基石!!!
1 0
- java多线程中的等待唤醒机制--多生产者多消费者问题
- Java多线程生产者消费者说明等待唤醒机制问题和虚假唤醒问题
- 多线程-生产者消费者之等待唤醒机制
- 多线程-等待唤醒机制经典案例-生产者消费者
- 多线程_生产者消费者之等待唤醒机制思路图解
- 多线程_生产者消费者之等待唤醒机制代码实现
- 多线程_生产者消费者之等待唤醒机制代码分析
- 多线程_生产者消费者之等待唤醒机制代码优化
- 多线程-生产者消费者之等待唤醒机制代码优化
- 多生产者和多消费者等待唤醒
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- java多线程(2):线程通信之生产者消费者模式及等待唤醒机制
- Java等待/通知机制:生产者-消费者问题
- 生产者和消费者之等待唤醒机制
- java 分别利用synchronized和jdk1.5新特性实现多消费者-多生产者线程的等待唤醒机制
- 多线程——等待唤醒机制经典实例:生产者消费者模式
- 多线程——等待唤醒机制经典实例:生产者消费者模式(优化)
- java多线程等待唤醒机制
- Math.random()取一个区间的随机数
- 标准盒子模型和IE盒子模型
- Hadoop2.6.0官方MapReduce文档翻译 之 二
- android Dialog弹出框对物理按键的响应
- ssh项目中对抛出java.sql.SQLException: No suitable driver异常的处理
- java多线程中的等待唤醒机制--多生产者多消费者问题
- 实现安卓页面的跳转
- MVC的一些个人看法
- 基于ubuntu的ARM开发环境搭建
- 深度学习Deep Learning 101
- java中Pattern类
- ListView学习之优化
- 图像旋转(ccf)
- 正则表达式