转 https://www.oschina.net/code/snippet_111708_25438

这个问题挺经典,我这个解法的本质在于将问题抽象为生产者消费者模型,但是是一个特殊的生产者消费者模型,有两点要求:
1、缓冲区大小为1(用一个布尔变量表示就可以了)
2、缓冲区初始为空
再具体点可以将其想象为一个一次只能放一张纸打印的打印机,放纸的线程是A,打印的线程是B。初始状态打印机没有纸。

// 打印机类
public class Printer {
     
    private boolean hasBufferToPrint = false;   // 打印缓冲区是否有内容可以打印
 
    // 打印A:相当于生产者,放一张纸
    public synchronized void printA() {
        while(hasBufferToPrint) {   // 缓冲区还有内容
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
         
        System.out.print("A");
        hasBufferToPrint = true;
         
        notify();   // 唤醒打印B的线程
    }
     
    // 打印B:相当于消费者,消耗缓冲区中的纸,打印纸张
    public synchronized void printB() {
        while (!hasBufferToPrint) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
         
        System.out.print("B");
        hasBufferToPrint = false;
         
        notify();   // 唤醒打印A的线程
    }
 
    static class ThreadA extends Thread {
        private Printer printer;
 
        public ThreadA(Printer printer) {
            this.printer = printer;
        }
 
        public void run() {
            for(int i = 0; i < 10; i++) {
                printer.printA();
            }
        }
    }
 
    static class ThreadB extends Thread {
        private Printer printer;
         
        public ThreadB(Printer printer) {
            this.printer = printer;
        }
         
        public void run() {
            for(int i = 0; i < 10; i++) {
                printer.printB();
            }
        }
    }
 
    public static void main(String args[]) {
        Printer printer = new Printer();   // A、B线程共享同一个打印机
        Thread a = new ThreadA(printer);
        Thread b = new ThreadB(printer);
         
        a.start();
        b.start();
    }
}

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

  1. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  2. java多线程 生产者消费者案例-虚假唤醒

    package com.java.juc; public class TestProductAndConsumer { public static void main(String[] args) { ...

  3. java多线程生产者消费者

    //Java Thread producer customer class ThreadTest { public static void main(String[] args) { Q q=new ...

  4. Java 多线程 - 生产者消费者问题

    https://www.cnblogs.com/hckblogs/p/7858545.html

  5. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

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

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

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

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

  8. Java实现多线程生产者消费者模型及优化方案

    生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...

  9. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

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

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

随机推荐

  1. HanLP分词命名实体提取详解

    HanLP分词命名实体提取详解   分享一篇大神的关于hanlp分词命名实体提取的经验文章,文章中分享的内容略有一段时间(使用的hanlp版本比较老),最新一版的hanlp已经出来了,也可以去看看新版 ...

  2. 利用ST MCU内部基准参考电压监测电源电压及其它

    在使用ST MCU开发过程中,有人问如果电源电压是变动的,询问有无办法用比较简洁的办法对电源电压进行监测,或者说电源电压波动情况下能否检测出其它待测的AD输入电压. 这里跟大家分享交流一个方法.就是在 ...

  3. 性能优化之永恒之道(实时sql优化vs业务字段冗余vs离线计算)

    在项目中,随着时间的推移,数据量越来越大,程序的某些功能性能也可能会随之下降,那么此时我们不得不需要对之前的功能进行性能优化.如果优化方案不得当,或者说不优雅,那可能将对整个系统产生不可逆的严重影响. ...

  4. Using the SDRAM on Altera’s DE1-SoC Board with Verilog Designs

    Using the SDRAM on Altera’sDE1-SoC Board with Verilog Designs 1.DE1-SOC Board上SDRAM资源 2.系统架构框图 3.关于S ...

  5. Windows 10 的有趣快捷键

    先升级到最新版Windows 10,比如:易升 快捷键 功能 Ctrl+Win+C 感受黑白灰的世界 Win+Shift+S 系统级自由截图快捷键 Win+D Win+Ctrl+D Win+Ctrl+ ...

  6. 黄聪:浓缩的才是精华:浅析GIF格式图片的存储和压缩(转)

    http://www.cnblogs.com/qcloud1001/p/6647080.html 成文迪, 在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦. GIF格式 ...

  7. 项目出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法

    1. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path ①项 ...

  8. C/C++基础----拷贝控制

    拷贝控制操作,有5个特殊成员函数copy ctor,copy =opt,move ctor,move =opt,dtor 有哪些地方会用到 拷贝初始化 除了=定义变量时 参数传递和函数返回时 花括号列 ...

  9. CTE(Common Table Expression) 公用表表达式

    在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以 使用公用表表达式的方法.公用表表达式(Common Tabl ...

  10. 廖雪峰Java2面向对象编程-5包和classpath-1静态字段和方法

    1.静态字段 1.1定义:用static修饰的字段称为静态字段 普通字段在每个实例中都有自己的一个独立的空间 静态字段只有1个共享空间,所有实例都共享该字段. public class Person{ ...