生产与消费者问题:假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者从仓库中取走产品;如果仓库中没有产品,生产者就将产品放入仓库,否则就停止生产等待;如果仓库中有产品,消费者就取走,否则就等待生产者生产

生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件

Java提供了解决线程之间通信问题的方法:wait()  //表示线程一直等待,知道其他线程通知,与sleep不同,会释放锁

                   wait(long timeout)  //指定等待的毫秒数

                   notify()  //唤醒一个处于等待状态的线程

                   notifyAll()  //唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先调度

  注意:以上均是Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常IllegalMonitorStateException

解决办法:1.加入缓冲池,消费者和生产者都在缓冲池里操作

 1 package com.Cra2iTeT.Demo03;
2
3 public class test1 {
4 public static void main(String[] args) {
5 Container container = new Container();
6 new Producer(container).start();
7 new Consumer(container).start();
8 }
9 }
10
11 class Producer extends Thread {
12 Container container;
13
14 public Producer(Container container) {
15 this.container = container;
16 }
17
18 @Override
19 public void run() {
20 for (int i = 0; i < 100; i++) {
21 container.f1(new Product(i));
22 System.out.println("生产了" + i + "只鸡");
23 }
24 }
25 }
26
27 class Consumer extends Thread {
28 Container container;
29
30 public Consumer(Container container) {
31 this.container = container;
32 }
33
34 @Override
35 public void run() {
36 for (int i = 0; i < 100; i++) {
37 System.out.println("消费了" + container.f2().id + "只鸡");
38 }
39 }
40 }
41
42 class Product {
43 int id;
44 public Product(int id) {
45 this.id = id;
46 }
47 }
48
49 class Container {
50 Product[] products = new Product[100];
51 int count = 0;
52
53 public synchronized void f1(Product product) {
54 if (count == 10) {
55 try {
56 this.wait();
57 } catch (InterruptedException e) {
58 e.printStackTrace();
59 }
60 }
61 products[count] = product;
62 count++;
63 this.notifyAll();
64 }
65
66 public synchronized Product f2() {
67 if (count == 0) {
68 try {
69 this.wait();
70 } catch (InterruptedException e) {
71 // TODO Auto-generated catch block
72 e.printStackTrace();
73 }
74 }
75 count--;
76 Product product = products[count];
77 this.notifyAll();
78 return product;
79 }
80 }

2.加入信号标识,指定信号标识下由指定的线程操作

 1 package com.Cra2iTeT.Demo03;
2
3 public class test2 {
4 public static void main(String[] args) {
5 TV tv = new TV();
6 new Player(tv).start();
7 new Watcher(tv).start();
8 }
9 }
10
11 class Player extends Thread {
12 TV tv;
13
14 public Player(TV tv) {
15 this.tv = tv;
16 }
17
18 @Override
19 public void run() {
20 for (int i = 0; i < 20; i++) {
21 if (i % 2 == 0) {
22 this.tv.play("青海摇");
23 } else {
24 this.tv.play("西安摇");
25 }
26 }
27 }
28 }
29
30 class Watcher extends Thread {
31 TV tv;
32
33 public Watcher(TV tv) {
34 this.tv = tv;
35 }
36
37 @Override
38 public void run() {
39 for (int i = 0; i < 20; i++) {
40 tv.watch();
41 }
42 }
43 }
44
45 class TV {
46 String voice;
47 boolean flag = true;
48
49 public synchronized void play(String voice) {
50 if (!flag) {
51 try {
52 this.wait();
53 } catch (InterruptedException e) {
54 e.printStackTrace();
55 }
56 }
57 System.out.println("演员表演了:" + voice);
58 this.notifyAll();
59 this.voice = voice;
60 this.flag = !this.flag;
61 }
62
63 public synchronized void watch() {
64 if (flag) {
65 try {
66 this.wait();
67 } catch (InterruptedException e) {
68 e.printStackTrace();
69 }
70 }
71 System.out.println("观看了:" + voice);
72 this.notifyAll();
73 this.flag = !this.flag;
74 }
75
76 }

明天学习线程池,总结多线程的学习过程

Java学习day32的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  3. 分享篇——我的Java学习路线

    虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...

  4. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  5. Java学习心得之 HttpClient的GET和POST请求

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 HttpClient的GET和POST请求 1. 前言2. GET请求3 ...

  6. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  7. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  8. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  9. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

随机推荐

  1. kubernetes更改coredns增加解析

    kubernetes更改coredns增加解析 k8s中coredns可以为全集群提供dns解析功能, 所以如果我们要手动增加dns解析, 只需在coredns中增加dns解析对即可 1. 编辑cor ...

  2. 常用正则表达式与python中的re模块

    正则表达式是一种通用的字符串匹配技术,不会因为编程语言不一样而发生变化. 部分常用正则表达式规则介绍: . 匹配任意的一个字符串,除了\n * 匹配任意字符串0次或者任意次 \w 匹配字母.数字.下划 ...

  3. jvm-learning-双亲委派机制

    是什么 工作原理  例子 优势 什么是沙箱安全机制 其他知识 对类加载器的引用 类的主动使用和被动使用

  4. SpringDataJpa使用审计(Auditing)功能

    SpringBoot项目使用SpringDataJpa提供的审计功能的使用流程 SpringDataJpa提供审计注解:@CreatedBy,@LastModifiedBy,@CreatedDate, ...

  5. 学习GlusterFS(三)

    glusterfs,GNU cluster file system,创始人Anand Babu Periasamy,目标:代替开源Lustre和商业产品GPFS,glusterfs是什么: cloud ...

  6. Leetcode1——两数之和 详细解析

    Leetcode1--两数之和 题目分类:数组.哈希表的应用 1. 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数 ...

  7. ctfhub rce 命令注入 过滤cat 过滤空格 过滤目录分隔符

    命令注入 源码直接给了出来尝试127.0.0.1;ls 发现一串数字的php文件cat查看 127.0.0.1|cat 233382768628619.php 查看源码发现flag 过滤cat 这题和 ...

  8. (5) 图和表(Figure and Table) 【论文写作】

  9. 搞半天,全国34个省份包含湾湾\香港\澳门的高德poi兴趣点23类数据终于爬完事了

    1.技术架构: python+阿里云数据库mongodb5.0+高德地图rest api 2.成本: 阿里云数据库mongodb5.0一个月话费1k多 2.遇到的问题 1)两个阿里云账号下 mongo ...

  10. html5的video元素学习手札

    为了监控移动端视频播放的情况,研究了一下 html5 <video> 标签的属性与事件触发,及其在各系统和各个浏览器的兼容情况 属性与事件 理解清楚属性和事件,才能更好的使用 video ...