面向工资编程,面向面试学习!
Java 实例 – 生产者/消费者问题

Java 教程

Java 教程Java 简介Java 开发环境配置Java 基础语法Java 对象和类Java 基本数据类型Java 变量类型Java 修饰符Java 运算符Java 循环结构 – for, while 及 do…whileJava 条件语句 – if…elseJava Number & Math 类Java Character 类Java String 类Java StringBuffer 和 StringBuilder 类Java 数组Java 日期时间Java 正则表达式Java 方法Java 流(Stream)、文件(File)和IOJava 异常处理Java ByteArrayInputStream类Java DataInputStream类Java ByteArrayOutputStream类Java DataOutputStream类Java File类Java FileReader类Java FileWriter类Java 继承Java 重写(Override)与重载(Overload)Java 多态Java 抽象类Java 封装Java 接口Java 包(package)Java 数据结构Java Enumeration接口Java Bitset类Java Vector 类Java Stack 类Java Dictionary 类Java Map 接口Java Hashtable 类Java Properties 类Java 集合框架Java 泛型Java 序列化Java 网络编程Java URL处理Java 发送邮件Java 多线程编程Java Applet 基础Java 文档注释Java 实例Java 实例 – 如何编译 Java 文件Java 实例 – 如何执行编译过 Java 文件Java 实例 – 如何执行指定class文件目录(classpath)Java 实例 – 如何查看当前 Java 运行的版本?Java 实例 – 字符串比较Java 实例 – 查找字符串最后一次出现的位置Java 实例 – 删除字符串中的一个字符Java 实例 – 字符串替换Java 实例 – 字符串反转Java 实例 – 字符串查找Java 实例 – 字符串分割Java 实例 – 字符串小写转大写Java 实例 – 测试两个字符串区域是否相等Java 实例 – 字符串性能比较测试Java 实例 – 字符串优化Java 实例 – 字符串格式化Java 实例 – 连接字符串Java 实例 – 数组排序及元素查找Java 实例 – 数组添加元素Java 实例 – 获取数组长度Java 实例 – 数组反转Java 实例 – 数组输出Java 实例 – 数组获取最大和最小值Java 实例 – 数组合并Java 实例 – 数组填充Java 实例 – 数组扩容Java 实例 – 查找数组中的重复元素Java 实例 – 删除数组元素Java 实例 – 数组差集Java 实例 – 数组交集Java 实例 – 在数组中查找指定元素Java 实例 – 判断数组是否相等Java 实例 – 数组并集Java 实例 – 格式化时间(SimpleDateFormat)Java 实例 – 获取当前时间Java 实例 – 获取年份、月份等Java 实例 – 时间戳转换成时间Java 实例 – 方法重载Java 实例 – 输出数组元素Java 实例 – 汉诺塔算法Java 实例 – 斐波那契数列Java 实例 – 阶乘Java 实例 – 方法覆盖Java 实例 – instanceof 关键字用法Java 实例 – break 关键字用法Java 实例 – continue 关键字用法Java 实例 – 标签(Label)Java 实例 – enum 和 switch 语句使用Java 实例 – Enum(枚举)构造函数及方法的使用Java 实例 – for 和 foreach循环使用Java 实例 – Varargs 可变参数使用Java 实例 – 重载(overloading)方法中使用 VarargsJava 实例 – 文件路径比较Java 实例 – 创建文件Java 实例 – 获取文件修改时间Java 实例 – 在指定目录中创建文件Java 实例 – 检测文件是否存在Java 实例 – 设置文件只读Java 实例 – 文件重命名Java 实例 – 获取文件大小Java 实例 – 修改文件最后的修改日期Java 实例 – 创建临时文件Java 实例 – 向文件中追加数据Java 实例 – 将文件内容复制到另一个文件Java 实例 – 删除文件Java 实例 – 读取文件内容Java 实例 – 文件写入Java 实例 – 递归创建目录Java 实例 – 删除目录Java 实例 – 判断目录是否为空Java 实例 – 判断文件是否隐藏Java 实例 – 打印目录结构Java 实例 – 获取目录最后修改时间Java 实例 – 获取文件的上级目录Java 实例 – 在指定目录中查找文件Java 实例 – 获取目录大小Java 实例 – 遍历目录Java 实例 – 查看当前工作目录Java 实例 – 遍历系统根目录Java 实例 – 在指定目录中查找文件Java 实例 – 遍历指定目录下的所有文件Java 实例 – 遍历指定目录下的所有目录Java 实例 – Finally的用法Java 实例 – 多个异常处理(多个catch)Java 实例 – 异常处理方法Java 实例 – 使用 catch 处理异常Java 实例 – 链试异常Java 实例 – 重载方法异常处理Java 实例 – 获取异常的堆栈信息Java 实例 – 多线程异常处理Java 实例 – 自定义异常Java 实例 – 数字求和运算Java 实例 – 获取链表(LinkedList)的第一个和最后一个元素Java 实例 – 在链表(LinkedList)的开头和结尾添加元素Java 实例 – 利用堆栈将中缀表达式转换成后缀表达式Java 实例 – 队列(Queue)用法Java 实例 – 压栈出栈的方法实现字符串反转Java 实例 – 链表元素查找Java 实例 – 栈的实现Java 实例 – 旋转向量Java 实例 – 链表修改Java 实例 – 获取向量的最大元素Java 实例 – 获取向量元素的索引值Java 实例 – 获取链表的元素Java 实例 – 删除链表中的元素Java 实例 – 数组转集合Java 实例 – 集合比较Java 实例 – 集合转数组Java 实例 – 集合输出Java 实例 – 只读集合Java 实例 – 删除集合中指定元素Java 实例 – 集合反转Java 实例 – 集合遍历Java 实例 – 集合打乱顺序Java 实例 – 集合长度Java 实例 – HashMap遍历Java 实例 – 集合中添加不同类型元素Java 实例 – 使用 Enumeration 遍历 HashTableJava 实例 – 遍历 HashTable 的键值Java 实例 – 查找 List 中的最大最小值Java 实例 – List 截取Java 实例 – List 元素替换Java 实例 – List 循环移动元素Java 实例 – 获取指定主机的IP地址Java 实例 – 使用 Socket 连接到指定主机Java 实例 – 查看主机指定文件的最后修改时间Java 实例 – Socket 实现多线程服务器程序Java 实例 – 获取远程文件大小Java 实例 – ServerSocket 和 Socket 通信实例Java 实例 – 解析 URLJava 实例 – 获取 URL 响应头信息Java 实例 – 获取 URL响应头的日期信息Java 实例 – 网页抓取Java 实例 – 获取本机ip地址及主机名Java 实例 – 查看端口是否已使用Java 实例 – 查看线程是否存活Java 实例 – 死锁及解决方法Java 实例 – 线程优先级设置Java 实例 – 状态监测Java 实例 – 获取当前线程名称Java 实例 – 终止线程Java 实例 – 线程挂起Java 实例 – 获取线程idJava 实例 – 查看线程优先级Java 实例 – 获取所有线程Java 实例 – 获取线程状态Java 实例 – 中断线程Java 8 新特性Java 8 Lambda 表达式Java 8 方法引用Java 8 函数式接口Java 8 默认方法Java 8 StreamJava 8 Optional 类Java 8 Nashorn JavaScriptJava 8 日期时间 APIJava8 Base64Java xxxValue() 方法Java compareTo() 方法Java equals() 方法Java valueOf() 方法Java toString() 方法Java parseInt() 方法Java abs() 方法Java ceil() 方法Java floor() 方法Java rint() 方法Java round() 方法Java min() 方法Java max() 方法Java exp() 方法Java log() 方法Java pow() 方法Java sqrt() 方法Java sin() 方法Java cos() 方法Java tan() 方法Java asin() 方法Java acos() 方法Java atan() 方法Java atan2() 方法Java toDegrees() 方法Java toRadians() 方法Java random() 方法Java isLetter() 方法Java isDigit() 方法Java isWhitespace() 方法Java isUpperCase() 方法Java isLowerCase() 方法Java toUpperCase() 方法Java toLowerCase() 方法Java toString() 方法Java charAt() 方法Java compareTo() 方法Java compareToIgnoreCase() 方法Java concat() 方法Java contentEquals() 方法Java copyValueOf() 方法Java endsWith() 方法Java equals() 方法Java equalsIgnoreCase() 方法Java getBytes() 方法Java getChars() 方法Java hashCode() 方法Java indexOf() 方法Java lastIndexOf() 方法Java length() 方法Java matches() 方法Java regionMatches() 方法Java replace() 方法Java replaceAll() 方法Java replaceFirst() 方法Java split() 方法Java startsWith() 方法Java subSequence() 方法Java substring() 方法Java toCharArray() 方法Java toLowerCase() 方法Java toString() 方法Java toUpperCase() 方法Java trim() 方法Java valueOf() 方法Java intern() 方法Java Scanner 类Java MySQL 连接Java 实例 – 打印菱形Java 实例 – 九九乘法表Java 实例 – 打印矩形Java 实例 – 打印平行四边形Java 实例 – 打印倒立的三角形Java 实例 – 字符串分隔(StringTokenizer)Java 9 新特性Java 9 模块系统Java 9 REPL (JShell)Java 9 改进 JavadocJava 9 多版本兼容 jar 包Java 9 集合工厂方法Java 9 私有接口方法Java 9 改进的进程 APIJava 9 改进的 Stream APIJava 9 改进的 try-with-resourcesJava 9 改进的 @Deprecated 注解Java 9 钻石操作符(Diamond Operator)Java 9 改进的 Optional 类Java 9 多分辨率图像 APIJava 9 改进的 CompletableFuture APIJava switch case 语句

Java 实例 - 生产者/消费者问题

Java 实例 Java 实例

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

Java 实例 - 生产者/消费者问题

以下实例演示了如何通过线程解决生产者/消费者问题:

以上代码运行输出结果为:

Java 实例 Java 实例