线程间的通信

喜欢ヅ旅行 2022-01-29 10:34 340阅读 0赞

典型例子就是生产者-消费者模式,仓库为空时,消费者无法从仓库调动产品,只能wait,直到仓库有产品时被notify;仓库满了时,生产者则暂时停止生产(wait),直到仓库有空被notify。
仓库售货员类:

  1. package com.sy.iodemo;
  2. public class Clerk {
  3. private int product =0;
  4. public synchronized void addProduct(){
  5. if(product >= 10){
  6. try{
  7. wait();
  8. }catch(InterruptedException e){
  9. e.printStackTrace();
  10. }
  11. }else{
  12. product++;
  13. System.out.println("生产者生产了第"+product+"个产品");
  14. notifyAll();
  15. }
  16. }
  17. public synchronized void getProduct(){
  18. if(product <=0){
  19. try{
  20. wait();
  21. }catch(InterruptedException e){
  22. e.printStackTrace();
  23. }
  24. }else{
  25. System.out.println("消费者取走了第"+product+"个产品");
  26. product--;
  27. notifyAll();
  28. }
  29. }
  30. }

生产者类:

  1. package com.sy.iodemo;
  2. public class Productor implements Runnable{
  3. Clerk clerk;
  4. public Productor(Clerk clerk){
  5. this.clerk = clerk;
  6. }
  7. public void run(){
  8. while(true){
  9. try{
  10. Thread.sleep(2000);
  11. }catch(InterruptedException e){
  12. e.printStackTrace();
  13. }
  14. clerk.addProduct();
  15. }
  16. }
  17. }

消费者类:

  1. package com.sy.iodemo;
  2. public class Consumer implements Runnable{
  3. Clerk clerk;
  4. public Consumer(Clerk clerk){
  5. this.clerk = clerk;
  6. }
  7. public void run(){
  8. while(true){
  9. try{
  10. Thread.sleep(2000);
  11. }catch(InterruptedException e){
  12. e.printStackTrace();
  13. }
  14. clerk.getProduct();
  15. }
  16. }
  17. }

结果(部分):

  1. 生产者生产了第1个产品
  2. 生产者生产了第2个产品
  3. 消费者取走了第2个产品
  4. 生产者生产了第2个产品
  5. 消费者取走了第2个产品
  6. 生产者生产了第2个产品
  7. 消费者取走了第2个产品
  8. 生产者生产了第2个产品
  9. 消费者取走了第2个产品

发表评论

表情:
评论列表 (有 0 条评论,340人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线通信

    1、什么是多线程之间通信 多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。 于是我们引出了等待唤醒机制:

    相关 线通信

    为什么需要线程通讯 线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定的代码逐步的执行,但是如果每个线程间都孤立的运行,那就会造资源浪费。所以在现实中,我们需要这

    相关 线通信

      https://www.cnblogs.com/hapjin/p/5492619.html 通常可用把并行程序理解为一组相互独立的、能够发关和接收消息的组件,这也称为角

    相关 线通信

    线程和线程之间不是独立的个体,它们彼此之间可以互相通信和协作。 线程通信就是在线程之间传递信息,保证他们能够协同工作。在线程间进行通信后,系统之间的交互性会更强大,在大大提高

    相关 线通信

    一、引言 线程与线程之间不是相互独立的存在,它们彼此之间需要相互通信和协作。最典型的例子就是生产者-消费者问题。下面首先介绍 wait/notify 机制,并对实现该机制

    相关 线通信

    注意: 必须在同步方法中使用wait和notify方法,因为执行wait和notify的前提条件是必须持有同步方法(或块)的monitor的所有权,否则将会抛出异常

    相关 线通信

    典型例子就是生产者-消费者模式,仓库为空时,消费者无法从仓库调动产品,只能wait,直到仓库有产品时被notify;仓库满了时,生产者则暂时停止生产(wait),直到仓库有空被