java 多线程(生产者消费者)

转 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();
     }
}

转载于:https://www.cnblogs.com/elenz/p/6849700.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值