• 线程间通信(生产者和消费者案例)


    一、传统的线程间通信的方式

    使用

    Object:

            synchronized:阻塞锁

            wait():阻塞当前队列

            notifyAll():唤醒所有阻塞队列

    1. package ProduceAndConsumer;
    2. /*
    3. * @Auther:生产者消费者案例1
    4. * @Date:2024/6/20
    5. * @Description:qinhao
    6. * @VERSON:1.8
    7. */
    8. public class PACTest {
    9. public static void main(String[] args) {
    10. Clerk clerk = new Clerk();
    11. new Thread(new Product(clerk)).start();
    12. new Thread(new Consumer(clerk)).start();
    13. }
    14. }
    15. class Clerk{
    16. private int count = 0;
    17. private static final int maxCount = 3;
    18. public synchronized void product() throws InterruptedException {
    19. if(count < maxCount){
    20. Thread.sleep(500);
    21. count++;
    22. System.out.println(Thread.currentThread().getName() + "生产了一个商品,当前商品有:" + count);
    23. notifyAll();
    24. }else{
    25. System.out.println(Thread.currentThread().getName() + "仓库已满");
    26. this.wait();
    27. }
    28. }
    29. public synchronized void consumer() throws InterruptedException {
    30. if(count > 0){
    31. Thread.sleep(500);
    32. count--;
    33. System.out.println(Thread.currentThread().getName() + "消费了一个商品,当前商品有:" + count);
    34. notifyAll();
    35. }else{
    36. System.out.println(Thread.currentThread().getName() + "缺货");
    37. this.wait();
    38. }
    39. }
    40. }
    41. //生产者
    42. class Product implements Runnable{
    43. private Clerk clerk;
    44. Product(Clerk clerk){this.clerk = clerk;}
    45. @Override
    46. public void run() {
    47. while(true){
    48. try {
    49. clerk.product();
    50. } catch (InterruptedException e) {
    51. throw new RuntimeException(e);
    52. }
    53. }
    54. }
    55. }
    56. //消费者
    57. class Consumer implements Runnable{
    58. private Clerk clerk;
    59. Consumer(Clerk clerk){this.clerk = clerk;}
    60. @Override
    61. public void run() {
    62. while(true){
    63. try {
    64. clerk.consumer();
    65. } catch (InterruptedException e) {
    66. throw new RuntimeException(e);
    67. }
    68. }
    69. }
    70. }

    二、Condition控制线程通信

    使用 :

    lock :

            lock():加锁

            unlock():释放锁

    condition:

            await():阻塞当前线程

            signalall():唤醒阻塞线程

    1. package ProduceAndConsumer;
    2. /*
    3. * @Auther:勤学好问
    4. * @Date:2024/6/20
    5. * @Description:qinhao
    6. * @VERSON:1.8
    7. */
    8. import java.util.concurrent.locks.Condition;
    9. import java.util.concurrent.locks.Lock;
    10. import java.util.concurrent.locks.ReentrantLock;
    11. public class PACTest {
    12. public static void main(String[] args) {
    13. Clerk clerk = new Clerk();
    14. new Thread(new Product(clerk)).start();
    15. new Thread(new Consumer(clerk)).start();
    16. }
    17. }
    18. class Clerk {
    19. private int count = 0;
    20. private static final int maxCount = 3;
    21. private Lock lock = new ReentrantLock();
    22. private Condition condition = lock.newCondition();
    23. public void product() throws InterruptedException {
    24. //枷锁
    25. lock.lock();
    26. //确保锁释放
    27. try {
    28. if (count < maxCount) {
    29. Thread.sleep(500);
    30. count++;
    31. System.out.println(Thread.currentThread().getName() + "生产了一个商品,当前商品有:" + count);
    32. condition.signalAll();
    33. } else {
    34. System.out.println(Thread.currentThread().getName() + "仓库已满");
    35. condition.await();
    36. }
    37. } finally {
    38. lock.unlock();
    39. }
    40. }
    41. public void consumer() throws InterruptedException {
    42. //枷锁
    43. lock.lock();
    44. //确保锁会释放
    45. try {
    46. if (count > 0) {
    47. Thread.sleep(500);
    48. count--;
    49. System.out.println(Thread.currentThread().getName() + "消费了一个商品,当前商品有:" + count);
    50. condition.signalAll();
    51. } else {
    52. System.out.println(Thread.currentThread().getName() + "缺货");
    53. condition.await();
    54. }
    55. } finally {
    56. lock.unlock();
    57. }
    58. }
    59. }
    60. class Product implements Runnable {
    61. private Clerk clerk;
    62. Product(Clerk clerk) {
    63. this.clerk = clerk;
    64. }
    65. @Override
    66. public void run() {
    67. while (true) {
    68. try {
    69. clerk.product();
    70. } catch (InterruptedException e) {
    71. throw new RuntimeException(e);
    72. }
    73. }
    74. }
    75. }
    76. class Consumer implements Runnable {
    77. private Clerk clerk;
    78. Consumer(Clerk clerk) {
    79. this.clerk = clerk;
    80. }
    81. @Override
    82. public void run() {
    83. while (true) {
    84. try {
    85. clerk.consumer();
    86. } catch (InterruptedException e) {
    87. throw new RuntimeException(e);
    88. }
    89. }
    90. }
    91. }

  • 相关阅读:
    Educational Codeforces Round 129 (Rated for Div. 2)
    6.认识Java的API 使用Java函数库
    FPS游戏之漫谈Shader.globalMaximumLOD
    2023计算机毕业设计SSM最新选题之java企业会议室预约系统的设计与实现3j969
    微信小程序开发之会议oa(首页搭建)
    将每个Excel文件的数据量统一减少至120000行
    做外贸这么久,为什么一直做不好?
    LLM系列 | 22 : Code Llama实战(下篇):本地部署、量化及GPT-4对比
    瑞郎走弱有助于瑞士国家银行MogaFX外汇储备增加
    Nginx:动静分离(示意图+配置讲解)
  • 原文地址:https://blog.csdn.net/qh1112/article/details/139843432