Java通过wait()和notifyAll()方法实现线程间通信

发布时间 - 2026-01-11 00:34:46    点击率:

本文实例为大家分享了Java实现线程间通信的具体代码,供大家参考,具体内容如下

Java代码(使用了2个内部类):

package Threads;

import java.util.LinkedList;

/**
 * Created by Frank
 */
public class ProdCons {
 protected LinkedList<Object> list = new LinkedList<>();
 protected int max;
 protected boolean done = false;

 public static void main(String[] args) throws InterruptedException {
  ProdCons prodCons = new ProdCons(100, 3, 4);
  Thread.sleep(5 * 1000);
  synchronized (prodCons.list) {
   prodCons.done = true;
   try {
    prodCons.notifyAll();
   } catch (Exception ex) {
   }
  }
 }

 private ProdCons(int maxThreads, int nP, int nC) {
  this.max = maxThreads;
  for (int i = 0; i < nP; i++) {
   new Producer().start();
  }
  for (int i = 0; i < nC; i++) {
   new Consumer().start();
  }
 }

 class Producer extends Thread {
  public void run() {
   while (true) {
    Object justProduced = null;
    try {
     justProduced = getObj();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    synchronized (list) {
     while (list.size() == max) {
      try {
       list.wait();
      } catch (InterruptedException e) {
       System.out.println("Producer INTERRUPTED");
      }
     }
     list.addFirst(justProduced);
     list.notifyAll();
     System.out.println("Produced 1;List size now " + list.size());
     if (done) {
      break;
     }
    }
   }
  }
 }

 class Consumer extends Thread {
  public void run() {
   while (true) {
    Object object = null;
    synchronized (list) {
     if (list.size() == 0) {
      try {
       list.wait();
      } catch (InterruptedException e) {
       System.out.println("Consumer INTERRUPTED");
      }
     }
     if (list.size() > 0) {
      object = list.removeLast();
     }
     list.notifyAll();
     System.out.println("List size now " + list.size());
     if (done) {
      break;
     }
    }
    if (null != object) {
     System.out.println("Consuming object " + object);
    }
   }
  }
 }

 private Object getObj() throws InterruptedException {
  Thread.sleep(1000);
  return new Object();
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Java  # wait  # notifyAll  # 线程通信  # Java使用wait/notify实现线程间通信上篇  # 浅谈Java线程间通信之wait/notify  # Java使用wait/notify实现线程间通信下篇  # 大家分享  # 具体内容  # 大家多多  # 使用了  # list  # int  # boolean  # max  # lt  # protected  # gt  # Object  # args  # String  # InterruptedException  # throws  # static  # false  # main  # void 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android使用GridView实现日历的简单功能  微信推文制作网站有哪些,怎么做微信推文,急?  网站制作软件有哪些,制图软件有哪些?  微信公众帐号开发教程之图文消息全攻略  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  浅析上传头像示例及其注意事项  如何快速生成ASP一键建站模板并优化安全性?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  python中快速进行多个字符替换的方法小结  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  如何将凡科建站内容保存为本地文件?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  如何用免费手机建站系统零基础打造专业网站?  如何快速搭建FTP站点实现文件共享?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何基于云服务器快速搭建个人网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  移动端脚本框架Hammer.js  微信小程序 闭包写法详细介绍  如何快速搭建二级域名独立网站?  历史网站制作软件,华为如何找回被删除的网站?  如何在IIS中新建站点并配置端口与物理路径?  如何在云主机快速搭建网站站点?  如何在IIS中新建站点并解决端口绑定冲突?  java中使用zxing批量生成二维码立牌  Laravel如何处理表单验证?(Requests代码示例)  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  香港服务器选型指南:免备案配置与高效建站方案解析  原生JS获取元素集合的子元素宽度实例  如何实现建站之星域名转发设置?  青岛网站建设如何选择本地服务器?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  详解MySQL数据库的安装与密码配置  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  利用python获取某年中每个月的第一天和最后一天  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  LinuxCD持续部署教程_自动发布与回滚机制  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  Linux系统命令中screen命令详解  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  装修招标网站设计制作流程,装修招标流程?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  网站建设整体流程解析,建站其实很容易!