蜜蜂和熊的问题

  • 100只蜜蜂,2头熊,每只蜜蜂每次生产的蜂蜜是1,有一个罐子,容量是50
  • 罐子的蜂蜜量一旦到达20,熊就一次吃掉20

注意问题

  • 生产和消费函数在等待结束执行完生产消费逻辑后要notifyAll()
  • 生产者和消费者执行完生产消费函数后要yield()
  • 以上两点可以保证蜂蜜到达20以后熊尽快开始消费,不然总是等到罐子满了熊才开始消费。

代码

App.java

    public static void main(String[] args) throws Exception {HoneyPot pot = new HoneyPot();Bear bear1 = new Bear("bear1", pot);Bear bear2 = new Bear("bear2", pot);bear1.start();bear2.start();for(int i=1;i<=100;i++){new Bee(Integer.toString(i), pot).start();}}

HoneyPot.java

public class HoneyPot {int honey;private final static int capacity = 50;synchronized void add(int i) throws InterruptedException {while (honey == capacity) {this.wait();}honey += i;System.out.println("added, pot cp: " + honey);this.notifyAll();}synchronized void remove(int i) throws InterruptedException {while (honey < i) {this.wait();}honey -= i;System.out.println("removed, pot cp: " + honey);this.notifyAll();}
}

Bee.java

public class Bee extends Thread {private String bname;private HoneyPot hp;Bee(String bname, HoneyPot hp){this.bname = bname;this.hp = hp;}@Overridepublic void run() {while(true){try {hp.add(1);System.out.println(bname + " : +1");this.yield();} catch (InterruptedException e) {e.printStackTrace();}}}
}

Bear.java

public class Bear extends Thread {private String bname;private final static int drink = 20;private HoneyPot hp;Bear(String bname, HoneyPot hp) {this.bname = bname;this.hp = hp;}@Overridepublic void run() {while (true) {try {hp.remove(drink);System.out.println(bname + " - : " + drink);this.yield();} catch (InterruptedException e) {e.printStackTrace();}}}
}

Java 多线程实现蜜蜂和熊的问题相关推荐

  1. Java 多线程的基本方式

    Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

  2. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...

  3. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

  4. 【收藏】Java多线程/并发编程大合集

    (一).[Java并发编程]并发编程大合集-兰亭风雨    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [ ...

  5. 40个Java多线程问题总结

    (转) 这篇文章作者写的真是不错 40个问题汇总 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所 ...

  6. Java多线程编程实战:模拟大量数据同步

    背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的.否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果. 不过笔者仍旧认为自己对于多线程 ...

  7. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  8. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

  9. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

最新文章

  1. jwt 私钥_一分钟带你了解JWT认证
  2. SQL JOIN 中 on 与 where 有何区别
  3. C primer 第六章循环 习题6.7
  4. python安装第三方库win10_在win里anaconda怎么安装第三方的库
  5. iOS 正则表达式判断纯数字以及匹配11位手机号码
  6. 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并
  7. Redis系列三、redis的五种数据结构和相关指令之Hash
  8. python离线录音转文字_Python将文字转成语音并读出来的实例详解
  9. IOS 自定义导航栏标题和返回按钮标题
  10. 盛情难却:北京,QECon来了
  11. 概率论速成-基于mooc
  12. Java全系列教程:『Java学习指南』
  13. java转盘抽奖算法_抽奖算法 - 幸运大转盘 - java
  14. 人人车北京第二家严选店开业 称年内将覆盖一二线城市
  15. sql server备份及导出表数据和结构
  16. 三相异步电机的平衡方程式
  17. 程序员如何提升自身价值
  18. 推荐5 个 NeoVim GUI 编辑器
  19. python市场_大交易数据的python市场篮子分析
  20. arping命令使用方法

热门文章

  1. python基础之面向对象1
  2. linux 下oralce 11g的rman 备份
  3. 保温杯哪种材质最好_保温杯使用什么材质的最好?
  4. 将十六进制数据转换成有符号十进制数
  5. 《学习如何学习》week3 1.1-1.3 拖延症和习惯的四个阶段
  6. CoreMark跑分测试
  7. 用html5和jquery制作个人博客
  8. elasticsearch在重启机器后出现[transport.netty][solr001] exception caught on transport layer[[[id:0x2d16759]]
  9. android 仿 淘宝淘口令
  10. CentOS 7 安装NFS