当前位置: 首页 > news >正文

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

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();
    }
}
复制代码

转载于:https://www.cnblogs.com/chinaifae/p/10238496.html

相关文章:

  • Ado.NET SQLHelper
  • ubuntu14.04 忘记root密码
  • 神奇语言python文件操作
  • Microsoft SQL Server登陆Linux
  • VSCode Python开发环境配置
  • 企业是怎么给MYSQL赋予用户权限
  • mongoDB 删除集合后,空间不释放
  • mysql分页(ajax)
  • BZOJ 1565 植物大战僵尸(最大权闭合图)
  • UVa 1586 - Molar mass
  • 072:【Django数据库】ORM聚合函数详解-aggregate和annotate
  • 配置ssh的双机信任
  • hdfs远程连接异常
  • linux if 命令判断条件总结
  • 【M15】了解异常处理(exception handling)的成本
  • 345-反转字符串中的元音字母
  • cookie和session
  • eclipse(luna)创建web工程
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 网络编程(2):UDP 的使用
  • vue 个人积累(使用工具,组件)
  • Vue.js源码(2):初探List Rendering
  • 创建一个Struts2项目maven 方式
  • 订阅Forge Viewer所有的事件
  • 番外篇1:在Windows环境下安装JDK
  • 漂亮刷新控件-iOS
  • 实现简单的正则表达式引擎
  • 首页查询功能的一次实现过程
  • 组复制官方翻译九、Group Replication Technical Details
  • # Panda3d 碰撞检测系统介绍
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (03)光刻——半导体电路的绘制
  • (1)(1.11) SiK Radio v2(一)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (安卓)跳转应用市场APP详情页的方式
  • (二)windows配置JDK环境
  • (附源码)springboot教学评价 毕业设计 641310
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)为什么要选择C++
  • (译)2019年前端性能优化清单 — 下篇
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @html.ActionLink的几种参数格式
  • @软考考生,这份软考高分攻略你须知道
  • [].slice.call()将类数组转化为真正的数组
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [bzoj1324]Exca王者之剑_最小割