位置:首页 > Java > 什么是问题引出及其常见应用场景

什么是问题引出及其常见应用场景

时间:2026-08-15  |  作者:星河游者  |  阅读:0

线程间通信示例:生产者与消费者

为了更好地理解线程间的通信,可以模拟现实生活中常见的生产者消费者场景。

假设有两个线程:生产者线程消费者线程,同时去操作同一种商品。其中,生产者线程负责生产商品,消费者线程负责消费商品。

接下来通过一个案例来实现上述情况,具体实现如文件1所示。

文件1 Example16.ja va

 1    import ja va.util.*;
 2    public class Example16 {
 3        public static void main(String[] args) {
 4            // 定义一个集合类,模拟存储生产的商品
 5            List goods = new ArrayList<>();
 6            // 记录线程执行前统一的起始时间start
 7            long start = System.currentTimeMillis();
 8            // 创建一个生产者线程,用于生产商品并存入商品集合
 9            Thread thread1 = new Thread(() -> {
 10                int num = 0;
 11                while (System.currentTimeMillis()-start<=100) {
 12                    goods.add("商品" + ++num);
 13                    System.out.println("生产商品" + num);
 14                }
 15            }, "生产者");
 16            // 创建一个消费线程,用于消费商品并将商品从集合删除
 17            Thread thread2 = new Thread(() -> {
 18                int num = 0;
 19                while (System.currentTimeMillis()-start<=100) {
 20                    goods.remove("商品" + ++num);
 21                    System.out.println("消费商品" + num);
 22                }
 23            }, "消费者");
 24            // 同时启动生产者和消费者两个线程,并统一执行100毫秒的时间
 25            thread1.start();
 26            thread2.start();
 27        }
 28    }

运行结果如图1所示。

什么是问题引出及其常见应用场景_wishdown.com

图1 运行结果

案例实现说明

文件1先做了一个基础的生产者—消费者场景模拟。

  • 生产者线程thread1负责生成商品,并把商品放进商品集合goods。
  • 消费者线程thread2负责取走并消费这些商品,同时从集合中删除对应商品。
  • 两个线程任务的共同运行时间统一控制在100毫秒内。

这样处理后,执行结果会更直观,数据也更方便观察。

借助这段执行窗口,可以把多线程运行过程中暴露出来的问题清晰地演示出来。

运行结果分析

从图1可以看到,两个线程任务在执行起初阶段还比较正常。

生产者线程一边生成商品,消费者线程一边消费商品。

但执行到后面,生产者线程和消费者线程的供需节奏不一致。消费者线程一直在消耗产品,而生产者线程不再生成产品。

出现这种情况显然是不正确的。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

精选合集

更多

大家都在玩