image.png

    /*
    线程通信的应用:经典例题:生产者/消费者问题

    分析:
    1.是否是多线程问题?是,生产者线程,消费者线程
    2.是否有共享数据?是,店员(或产品)
    3.如何解决线程的安全问题?同步机制,有三种方法
    4.是否涉及线程的通信?是


    *

    1. package com.atguigu.exercise1;
    2. /**
    3. * 线程通信的应用:经典例题:生产者/消费者问题
    4. *
    5. * 分析:
    6. * 1.是否是多线程问题?是,生产者线程,消费者线程
    7. * 2.是否有共享数据?是,店员(或产品)
    8. * 3.如何解决线程的安全问题?同步机制,有三种方法
    9. * 4.是否涉及线程的通信?是
    10. *
    11. *
    12. *
    13. * @author Dxkstart
    14. * @create 2021-05-07 21:33
    15. */
    16. public class ProductTest {
    17. public static void main(String[] args) {
    18. Clerk clerk = new Clerk();
    19. Produce p1 = new Produce(clerk);
    20. p1.setName("生产者1");
    21. Consumer c1 = new Consumer(clerk);
    22. c1.setName("消费者1");
    23. p1.start();
    24. c1.start();
    25. }
    26. }
    27. class Clerk{//共享的
    28. private int productCount = 0;
    29. //生产产品
    30. public synchronized void produceProduct() {
    31. if(productCount < 20){
    32. productCount ++;
    33. System.out.println(Thread.currentThread().getName() +
    34. ": 开始生产第"+ productCount+"个产品");
    35. notify();
    36. }else{
    37. //等待
    38. try {
    39. wait();
    40. } catch (InterruptedException e) {
    41. e.printStackTrace();
    42. }
    43. }
    44. }
    45. //消费产品
    46. public synchronized void consumeProduct() {
    47. if(productCount > 0){
    48. System.out.println(Thread.currentThread().getName()+
    49. ": 开始消费第"+ productCount + "个产品");
    50. productCount --;
    51. notify();
    52. }else{
    53. //等待
    54. try {
    55. wait();
    56. } catch (InterruptedException e) {
    57. e.printStackTrace();
    58. }
    59. }
    60. }
    61. }
    62. class Produce extends Thread{//生产者
    63. private Clerk clerk;
    64. public Produce(Clerk clerk) {
    65. this.clerk = clerk;
    66. }
    67. @Override
    68. public void run() {
    69. System.out.println(getName() + ": 开始生产产品.....");
    70. while(true){
    71. try {
    72. sleep(50);
    73. } catch (InterruptedException e) {
    74. e.printStackTrace();
    75. }
    76. clerk.produceProduct();
    77. }
    78. }
    79. }
    80. class Consumer extends Thread{//消费者
    81. private Clerk clerk;
    82. public Consumer(Clerk clerk) {
    83. this.clerk = clerk;
    84. }
    85. @Override
    86. public void run() {
    87. System.out.println(getName() + ":开始消费产品.....");
    88. while(true){
    89. try {
    90. sleep(50);
    91. } catch (InterruptedException e) {
    92. e.printStackTrace();
    93. }
    94. clerk.consumeProduct();
    95. }
    96. }
    97. }