文档章节

多线程 - 生产者消费者问题

o
 osc_fmg49rzg
发布于 2019/03/20 13:55
字数 750
阅读 7
收藏 0

精选30+云产品,助力企业轻松上云!>>>

(一)生产者消费者问题:

  1.题目:

    采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序。 对一个对象(枪膛)进行操作,其最大容量是10颗子弹。 生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,它不断从枪膛中射出子弹。

  2.分析:

    这是个生产者与消费者问题,也是线程的同步问题, 为了防止执行个线程访问一个资源时出现忙等待,要使用的wait-notify函数,是两个线程交替执行。

  3.解题步骤:

    a.创建一个Factory类,包含Produce()方法和Consume()方法;

    b.创建一个Producer线程,模拟生产子弹;

    c.创建一个Consume线程,模拟消费子弹 ;

    d.创建一个测试类Demo.

  4.画图理解:

  5.扩展 - 线程安全问题

    (1)线程安全出现的原因:

      a.多线程的环境下;(单线程不会出现安全问题)

      b.多个线程拥有资源;

      c.对共享资源的操作不是原子性的。(原子性是指一次操作要么执行完,要么不执行)

    (2)那么怎么解决线程安全问题呢?

      答:使用同步代码块。

        格式:
                 sychronized (对象) {
                     要同步的代码块(你走我不走,我走你不走)
                 }

(二)代码体现:

  1.创建一个Factory类

public class Factory {
    String name;//加工厂名字 int MAX_SIZE;//最多加工子弹数目 int size;//当前剩余子弹数 public Factory(String name, int MAX_SIZE) { this.name = name; this.MAX_SIZE = MAX_SIZE; } //使用同步方法,保证线程安全 public synchronized void produce(){ while (size >= MAX_SIZE){ try { //子弹充足,等待消费  wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { //加工子弹累了,休息会 Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //生产了一颗子弹 size++; System.out.println("压入了一颗子弹,还剩下" + size + ""); //唤醒等待的所有线程  notifyAll(); } //使用同步方法,保证线程安全 public synchronized void consume(){ while (size <= 0){ try { //没有子弹了,等待  wait(); } catch (InterruptedException e) { e.printStackTrace(); } try { Thread.sleep(200);//射出子弹累了,休息会 } catch (InterruptedException e) { e.printStackTrace(); } } //射出了一颗子弹 size--; System.out.println("射出了一颗子弹,还剩下" + size + ""); //唤醒等待的所有线程  notifyAll(); } }
Factory

  2.创建一个Producer类实现Runnable接口

public class Producer implements Runnable {
    Factory factory;

    public Producer(Factory factory) { this.factory = factory; } @Override public void run() { //循环生产 while (true){ factory.produce(); } } }
Producer

  3.创建一个Consume类实现Runnable接口

public class Consumer implements Runnable{
    Factory factory;

    public Consumer(Factory factory) { this.factory = factory; } @Override public void run() { //循环消费 while (true){ factory.consume(); } } }
Consumer

  4.创建一个测试类Demo

public class Demo {
    public static void main(String[] args) { //创建一个加工厂 Factory factory = new Factory("子弹加工厂",200); //创建一个生产者对象和一个消费者对象 Producer producer = new Producer(factory); Consumer consumer = new Consumer(factory); //创建一个生产者线程和一个消费者线程 Thread t1 = new Thread(producer); Thread t2 = new Thread(consumer); //启动线程  t1.start(); t2.start(); } }
Demo

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
python线程中的同步问题

多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000。但是由于是多线程访问,有可能出现下面情况: 运行结果...

osc_rg5fngik
2019/08/24
1
0
java阻塞队列实现生产者消费者模式

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

zhdan
2016/02/21
71
0
C#多线程学习(三) 生产者和消费者

[1] C#多线程学习(三) 生产者和消费者 [2]C#多线程学习(三) 生产者和消费者 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者...

Yamazaki
2012/03/29
19
0
C++实现生产者和消费者

传统的生产者消费者模型 生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题,实际上主要是包含了两类线...

osc_bx0x099p
2019/06/19
2
0
一篇文章理清Python多线程之同步条件,信号量和队列

公众号:pythonislover 今天这篇文章大概介绍下python多线程中的同步条件Event,信号量(Semaphore)和队列(queue),这是我们多线程系列的最后一篇文章,以后将会进入python多进程的系列。 同步...

南山yrg
2019/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

macz技巧分享—macOS高端使用技巧

Macos 的占有量不如 Windows,两者之间当操作方式也有很大的不同,当很多人熱悉 Windows 的操作之后,再接触 macos,觉得难上手,其实是习惯问题。如果你学习一些技巧,会觉得 macos 其实也不...

mac小叮当
56分钟前
11
0
手把手教你如何用黑白显示器显示彩色!

来源:大数据文摘 本文约1000字,建议阅读6分钟。 本文为你介绍如何通过黑白显示器上也能显示出彩色。 原来在黑白显示器上也能显示出彩色啊!通过在监视器上覆盖拜耳滤色镜,并拼接彩色图像,...

osc_jklrr90y
56分钟前
18
0
key-value结构排序:给定一个字符串,统计每个字符出现频率,先按value降序,再按key升序

对于key-value结构的排序 第一种:lambda表达式 第二种:函数 第三种:类对()的重载,仿函数形式 #include <iostream>#include <vector>#include <unordered_map>#include <string>#in......

osc_gwtkg2dc
57分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》 目录 世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球...

osc_vew1u0h0
58分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三)

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三) 目录 2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》 演讲嘉宾 演讲内容 ...

osc_8o71811p
59分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部