1.线程状态概述

image.png

2.Timed Waiting(计时等待)

image.png

3.BLOCKED(锁等待)

image.png

4.Waiting(无限等待)

Wating状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。
image.png

5.生产者和消费者案例

  1. package com.Study_01;
  2. public class BaoZi {
  3. String pi;
  4. String xian;
  5. boolean flag = false;
  6. }
  1. package com.Study_01;
  2. public class BaoZiPu extends Thread {
  3. // 需要在成员位置创建一个包子变量
  4. private BaoZi bz;
  5. // 使用带参数构造方法,为这个包子变量赋值
  6. public BaoZiPu(BaoZi bz) {
  7. this.bz = bz;
  8. }
  9. @Override
  10. public void run() {
  11. int count = 0;
  12. // 让包子铺一直生产包子
  13. while (true) {
  14. // 保证只能有一个在执行
  15. synchronized (bz) {
  16. // 对包子的状态进行判断
  17. if (bz.flag == true) {
  18. // 包子铺调用wait方法进入等待状态
  19. try {
  20. bz.wait();
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. // 被唤醒之后,包子铺生产包子
  26. // 增加趣味性 ,交替生产包字
  27. if (count % 2 == 0) {
  28. // 生产 薄皮三鲜馅
  29. bz.pi = "薄皮";
  30. bz.xian = "三鲜馅";
  31. } else {
  32. // 生产 冰皮 牛肉大葱馅
  33. bz.pi = "冰皮";
  34. bz.xian = "牛肉大葱馅";
  35. }
  36. count++;
  37. System.out.println("包子铺正在生产:" + bz.pi + bz.xian + "包子");
  38. // 生产包字需要三秒钟
  39. try {
  40. Thread.sleep(3000);
  41. } catch (InterruptedException e) {
  42. e.printStackTrace();
  43. }
  44. // 包子铺生产好了包子
  45. // 修改包字状态为 true
  46. bz.flag = true;
  47. // 唤醒吃货线程,让吃货线程吃包子
  48. bz.notify();
  49. System.out.println("包子已经生产好了:" + bz.pi + bz.xian + "包字,吃货可以开始吃了");
  50. }
  51. }
  52. }
  53. }
  1. package com.Study_01;
  2. public class ChiHuo extends Thread {
  3. // 需要在成员位置创建一个包子变量
  4. private BaoZi bz;
  5. // 使用带参数构造方法,为这个包子变量赋值
  6. public ChiHuo(BaoZi bz) {
  7. this.bz = bz;
  8. }
  9. @Override
  10. public void run() {
  11. // 使用死循环,保证吃货一直吃包子
  12. while (true) {
  13. synchronized (bz) {
  14. // 对包子状态进行判断
  15. if (bz.flag == false) {
  16. // 吃货调用wait方法进入等待状态
  17. try {
  18. bz.wait();
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. // 被唤醒之后的代码,吃包子
  24. System.out.println("吃货正在吃:" + bz.pi+bz.xian+ "的包子");
  25. // 吃货吃完包子
  26. // 修改包字的状态为false
  27. bz.flag = false;
  28. // 吃货唤醒包字铺线程,生产包子
  29. bz.notify();
  30. System.out.println("吃货已经把:"+bz.pi+bz.xian+"的包字吃完了,包子铺开始生产包子");
  31. System.out.println("-----------------------------------------------");
  32. }
  33. }
  34. }
  35. }
  1. package com.Study_01;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. BaoZi bz = new BaoZi();
  5. new BaoZiPu(bz).start();
  6. new ChiHuo(bz).start();
  7. }
  8. }