java 生产者 消费者模型问题

【JAVA】38. Condition条件队列实现生产者 - 消费者模型 在 Java 中,Condition接口是 Java 并发包中的一个重要接口,它为线程提供了一种更灵活的等待/通知机制,与Object类的wait()notify()和方法类似,但功能更强大。Condition实例是由Lock实例创建的,一个Lock可以创建多个Condition实例,每个Condition实例都有自己的等待队列。 阅读详情

最近一直在温习java多线程变成方面的知识,闲来无事,写了一段消费者和生产者之间线程通信的例子,代码如下

public class TestConsumerAndProducer {


    //消费者
    static class Consumer implements Runnable{


        private final Vector<String> obj;
        public Consumer(Vector<String> v){
            this.obj = v;
        }


        @Override
        public void run() {
            synchronized (obj){
                while (true) {


                    try {
                        System.out.println("移除苹果:" + obj.remove(0));
                        System.out.println("consumer thread:" + Thread.currentThread().getName() + ", obj size : " + obj.size());
                        if (obj.isEmpty()) {
                            //消费者等待
                            System.out.println("-----即将进入等待队列的线程::" + Thread.currentThread().getName());
                            obj.wait();
                            System.out.println("-----即将开始运行的线程:" + Thread.currentThread().getName());
                        }
                        //唤醒生产者
                        obj.notify();
                        System.out.println("-----被唤醒的线程:" + Thread.currentThread().getName());
                        TimeUnit.SECONDS.sleep(3);


                    } catch (Exception e) {
                        e.printStackTrace();
                    }


                }
            }
        }
    }


    //生产者
    static class Producer implements Runnable{


        private final Vector<String> obj;


        public Producer(Vector<String> v){
            this.obj = v;
        }


        @Override
        public void run() {
            synchronized (obj){
                do {


                    try {


                        if (obj.size() > 10) {
                            //生产者进行等待
                            System.out.println("-----即将进入等待队列的线程::" + Thread.currentThread().getName());
                            obj.wait();
                            System.out.println("-----即将开始运行的线程:" + Thread.currentThread().getName());
                        }
                        String seed = "apple" + new Random().nextInt(10);
                        obj.add(seed);
                        System.out.println("添加苹果:" + seed);
                        System.out.println("producer thread:" + Thread.currentThread().getName() + ", obj size : " + obj.size());
                        //唤醒消费者 此处在生产者没有执行wait 并释放锁之前 其他等待中的线程不会执行
                        obj.notify();
                        System.out.println("-----被唤醒的线程:" + Thread.currentThread().getName());
                        TimeUnit.SECONDS.sleep(3);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }


                } while (true);
            }
        }
    }


    public static void main(String[] args) {
        Vector<String> obj = new Vector<>();
        obj.add("apple");
        obj.add("apple");


        Thread consumer = new Thread(new Consumer(obj));
        Thread producer = new Thread(new Producer(obj));


        Thread consumer1 = new Thread(new Consumer(obj));
        Thread producer1 = new Thread(new Producer(obj));
        producer.setName("生产者1号");
        producer1.setName("生产者2号");
        consumer.setName("消费者1号");
        consumer1.setName("消费者2号");


        consumer.start();
        producer.start();


        consumer1.start();
        producer1.start();


    }


}

那么,问题来了。

以下是控制台日志:



移除苹果:apple
consumer thread:消费者1号, obj size : 1
-----被唤醒的线程:消费者1号
移除苹果:apple
consumer thread:消费者1号, obj size : 0
-----即将进入等待队列的线程::消费者1号
添加苹果:apple0
producer thread:生产者2号, obj size : 1
-----被唤醒的线程:生产者2号
添加苹果:apple6
producer thread:生产者2号, obj size : 2
-----被唤醒的线程:生产者2号
添加苹果:apple2
producer thread:生产者2号, obj size : 3
-----被唤醒的线程:生产者2号
添加苹果:apple7
producer thread:生产者2号, obj size : 4
-----被唤醒的线程:生产者2号
添加苹果:apple2
producer thread:生产者2号, obj size : 5
-----被唤醒的线程:生产者2号
添加苹果:apple6
producer thread:生产者2号, obj size : 6
-----被唤醒的线程:生产者2号
添加苹果:apple6
producer thread:生产者2号, obj size : 7
-----被唤醒的线程:生产者2号
添加苹果:apple4
producer thread:生产者2号, obj size : 8
-----被唤醒的线程:生产者2号
添加苹果:apple6
producer thread:生产者2号, obj size : 9
-----被唤醒的线程:生产者2号
添加苹果:apple3
producer thread:生产者2号, obj size : 10
-----被唤醒的线程:生产者2号
添加苹果:apple4
producer thread:生产者2号, obj size : 11
-----被唤醒的线程:生产者2号








-----即将进入等待队列的线程::生产者2号
移除苹果:apple0
consumer thread:消费者2号, obj size : 10
-----被唤醒的线程:消费者2号
移除苹果:apple6
consumer thread:消费者2号, obj size : 9
-----被唤醒的线程:消费者2号
移除苹果:apple2
consumer thread:消费者2号, obj size : 8
-----被唤醒的线程:消费者2号
移除苹果:apple7
consumer thread:消费者2号, obj size : 7
-----被唤醒的线程:消费者2号
移除苹果:apple2
consumer thread:消费者2号, obj size : 6
-----被唤醒的线程:消费者2号
移除苹果:apple6
consumer thread:消费者2号, obj size : 5
-----被唤醒的线程:消费者2号
移除苹果:apple6
consumer thread:消费者2号, obj size : 4
-----被唤醒的线程:消费者2号
移除苹果:apple4
consumer thread:消费者2号, obj size : 3
-----被唤醒的线程:消费者2号
移除苹果:apple6
consumer thread:消费者2号, obj size : 2
-----被唤醒的线程:消费者2号
移除苹果:apple3
consumer thread:消费者2号, obj size : 1
-----被唤醒的线程:消费者2号


移除苹果:apple4
consumer thread:消费者2号, obj size : 0
-----即将进入等待队列的线程::消费者2号
添加苹果:apple1
producer thread:生产者1号, obj size : 1
-----被唤醒的线程:生产者1号
添加苹果:apple6
producer thread:生产者1号, obj size : 2
-----被唤醒的线程:生产者1号
添加苹果:apple9
producer thread:生产者1号, obj size : 3
-----被唤醒的线程:生产者1号
添加苹果:apple8
producer thread:生产者1号, obj size : 4
-----被唤醒的线程:生产者1号
添加苹果:apple5
producer thread:生产者1号, obj size : 5
-----被唤醒的线程:生产者1号
添加苹果:apple3
producer thread:生产者1号, obj size : 6
-----被唤醒的线程:生产者1号
添加苹果:apple3
producer thread:生产者1号, obj size : 7
-----被唤醒的线程:生产者1号
添加苹果:apple8
producer thread:生产者1号, obj size : 8
-----被唤醒的线程:生产者1号
添加苹果:apple6
producer thread:生产者1号, obj size : 9
-----被唤醒的线程:生产者1号
添加苹果:apple9
producer thread:生产者1号, obj size : 10
-----被唤醒的线程:生产者1号
添加苹果:apple0
producer thread:生产者1号, obj size : 11
-----被唤醒的线程:生产者1号








-----即将进入等待队列的线程::生产者1号
-----即将开始运行的线程:消费者2号
-----被唤醒的线程:消费者2号
移除苹果:apple1
consumer thread:消费者2号, obj size : 10
-----被唤醒的线程:消费者2号
移除苹果:apple6
consumer thread:消费者2号, obj size : 9
-----被唤醒的线程:消费者2号
移除苹果:apple9
consumer thread:消费者2号, obj size : 8
-----被唤醒的线程:消费者2号
移除苹果:apple8
consumer thread:消费者2号, obj size : 7
-----被唤醒的线程:消费者2号
移除苹果:apple5
consumer thread:消费者2号, obj size : 6
-----被唤醒的线程:消费者2号
移除苹果:apple3
consumer thread:消费者2号, obj size : 5
-----被唤醒的线程:消费者2号
移除苹果:apple3
consumer thread:消费者2号, obj size : 4
-----被唤醒的线程:消费者2号
移除苹果:apple8
consumer thread:消费者2号, obj size : 3
-----被唤醒的线程:消费者2号
移除苹果:apple6
consumer thread:消费者2号, obj size : 2
-----被唤醒的线程:消费者2号
移除苹果:apple9
consumer thread:消费者2号, obj size : 1
-----被唤醒的线程:消费者2号
移除苹果:apple0
consumer thread:消费者2号, obj size : 0
-----即将进入等待队列的线程::消费者2号
-----即将开始运行的线程:生产者1号
添加苹果:apple4
producer thread:生产者1号, obj size : 1
-----被唤醒的线程:生产者1号










添加苹果:apple4
producer thread:生产者1号, obj size : 2
-----被唤醒的线程:生产者1号
添加苹果:apple7
producer thread:生产者1号, obj size : 3
-----被唤醒的线程:生产者1号
添加苹果:apple3
producer thread:生产者1号, obj size : 4
-----被唤醒的线程:生产者1号
添加苹果:apple0
producer thread:生产者1号, obj size : 5
-----被唤醒的线程:生产者1号
添加苹果:apple2
producer thread:生产者1号, obj size : 6
-----被唤醒的线程:生产者1号
添加苹果:apple7
producer thread:生产者1号, obj size : 7
-----被唤醒的线程:生产者1号
添加苹果:apple3
producer thread:生产者1号, obj size : 8
-----被唤醒的线程:生产者1号
添加苹果:apple4
producer thread:生产者1号, obj size : 9
-----被唤醒的线程:生产者1号
添加苹果:apple6
producer thread:生产者1号, obj size : 10
-----被唤醒的线程:生产者1号
添加苹果:apple0
producer thread:生产者1号, obj size : 11
-----被唤醒的线程:生产者1号












-----即将进入等待队列的线程::生产者1号
-----即将开始运行的线程:消费者2号
-----被唤醒的线程:消费者2号






移除苹果:apple4
consumer thread:消费者2号, obj size : 10
-----被唤醒的线程:消费者2号
移除苹果:apple4
consumer thread:消费者2号, obj size : 9
-----被唤醒的线程:消费者2号
移除苹果:apple7
consumer thread:消费者2号, obj size : 8
-----被唤醒的线程:消费者2号
移除苹果:apple3
consumer thread:消费者2号, obj size : 7
-----被唤醒的线程:消费者2号
移除苹果:apple0
consumer thread:消费者2号, obj size : 6
-----被唤醒的线程:消费者2号
移除苹果:apple2
consumer thread:消费者2号, obj size : 5
-----被唤醒的线程:消费者2号
移除苹果:apple7
consumer thread:消费者2号, obj size : 4
-----被唤醒的线程:消费者2号
移除苹果:apple3
consumer thread:消费者2号, obj size : 3
-----被唤醒的线程:消费者2号
移除苹果:apple4
consumer thread:消费者2号, obj size : 2
-----被唤醒的线程:消费者2号
移除苹果:apple6
consumer thread:消费者2号, obj size : 1
-----被唤醒的线程:消费者2号
移除苹果:apple0
consumer thread:消费者2号, obj size : 0
-----即将进入等待队列的线程::消费者2号
-----即将开始运行的线程:生产者1号

在main方法中,我同时启用了 生产者1号,生产者2号,消费者1号,消费者2号四个线程,同时对一个Vector对象进行操作,

可是从日志中可以得知,最先进入工作的是消费者1号,生产者2号,在两者执行完后,后续则完全由生产者1号和消费者2号执行。重复运行main方法可得到相同的结论,最先执行的消费者和生产者,只能执行一次,后续则完全由其他生产者和消费者不断重复地执行,是何原因?还请各位专家们指点,感激不尽!

生产者消费者模型 以下使代码实现,但有一个问题是,我的输出结果: 生产线程—>生产完成 消费线程—>消费完成 生产线程—>生产完成 生产线程—>生产完成 消费线程—>消费完成 消费线程—>消费完成 生产线程—>生产完成 消费线程—>消费完成 生产线程—>生产完成 生产线程—>生产完成 消费线程—>消费完成 生产线程—>生产完成 消费线程—&gt... 阅读详情

相关推荐

JAVA 并发编程之六:线程模型1:生产者-消费者模型 + 四种并发方案实现

前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。 现在用四种方式来实现生产者消费者模型 阻塞队列BlockingQueue的实现 阻塞队列,是一种常用的并发数据结构,常用于生产者-消费者模式。 在Java中,有很多种阻塞队列...

caobaokang的专栏 1578

生产者消费者模型与仓储模型案例解析

本文介绍了两种常见的多线程并发模型:生产者消费者模型和仓储模型。在生产者消费者模型中,通过synchronized同步机制和wait/notify通信机制,实现了单个/多个生产者与消费者之间的协调工作,确保数据同步和避免资源冲突。仓储模型则通过仓库类管理产品容量,使用队列模式实现先进先出的产品管理。两种模型都展示了Java多线程编程中解决资源共享、线程同步和通信的关键技术,包括synchronized关键字的使用、wait-notify机制的应用,以及在多生产者多消费者场景下使用notifyAll方法的重要

qq_52506743的博客 708

工程师职级胜任力框架

一、前言 尽管这些年国内的IT行业发展迅速,但是仍然欠缺一套比较综合性的面向工程师的职级胜任力框架,造成国内很多工程师大都一心只想成为技术大牛,而忽视了自己全方位的工程师职业素养和能力的培养。 最近我有幸读到了Circle CI公司分享的工程胜任力矩阵,发现这份文档就是一份比较贴合互联网研发型企业的工程师职级胜任力框架,于是我在它的基础上,重新整理出了一份更适合国内工程师阅读的《工程师职级胜任力框架》,并把它分享在波波的github站点上,希望这份文档对工程师的职业开发和成长有帮助。注,Circle CI.

架构师波波的专栏 6333

Java线程间通信问题分析(生产者消费者模型)

线程间通信问题: 不同线程间针对同一资源进行操作的问题 生产者消费者模型: 生产者(设置线程)和消费者(获取线程)对同一资源对象进行操作 实现: 一、学生类 Student.java public class Student{ private String name; private int age; public

rootlh的博客 300

海思HiMPP开发避坑指南:MMZ内存与系统内存傻傻分不清?一个例子讲透

本文深入解析海思HiMPP开发中MMZ内存与系统内存的关键差异与应用场景,帮助开发者避免常见的内存混淆问题。通过实际案例和性能对比,详细介绍了MMZ内存的特性和优化策略,提升多媒体处理效率。

weixin_30772105的博客 468

Qwen-Image-2512 本地部署完全指南:从零开始搭建你的AI绘图工作站

阿里通义团队开源了Qwen-Image-2512模型,这款AI绘图模型在人物真实感、自然细节和文字渲染上表现惊艳,甚至在盲测中超越部分闭源模型。本文提供了详细的本地部署教程,从硬件准备、环境安装到使用ComfyUI运行模型,手把手教你生成第一张AI图片,并分享了进阶技巧和免费在线体验方式。

莫潇羽的个人博客 2427

java实现生产者消费者模型

生产者消费者模型 生产者消费者模型,是通过一个容器来解决生产者和消费者的强耦合问题。通俗的讲,就是生产者在不断的生产,消费者也在不断的消费,可是消费者消费的产品是生产者生产的,这就必然存在一个中间容器,我们可以把这个容器想象成是一个货架,当货架空的时候,生产者要生产产品,此时消费者在等待生产者往货架上生产产品,而当货架满的时候,消费者可以从货架上拿走商品,生产者此时等待货架的空位,这样不断的循环。那么在这个过程中,生产者和消费者是不直接接触的,所谓的‘货架’其实就是一个阻塞队列,生产者生产的产品不直接给消费

KEVIN_WANG333的博客 267

EB TRESOS 29.0.0安装教程用于MCAL配置开发

本文介绍的搭建基于NXP官网提供EB软件,进行基于标准AUTOSAR软件底层驱动配置的开发

qq_53260940的博客 1879

Java可视化实现生产者消费者问题

引言:生产者消费者问题是一个十分经典的多线程问题。为了更加形象地描述这个问题,采用可视化的形式展示此过程。

王小明爱吃大菠萝的博客 6082

71、CAN总线双绞线绞距与抗共模干扰的定量关系

摘要:本文探讨了CAN总线双绞线绞距与抗共模干扰的定量关系。通过理论推导得出共模电压与绞距平方成正比,绞距越小抑制效果越好。工程实践表明,工业现场推荐绞距不超过30mm,高频干扰场景需优先优化绞距。实测数据验证了绞距均匀性的重要性,建议控制在15-25mm范围,安装时保持绞合结构完整。案例显示,将绞距从50mm改为15mm后,共模干扰从12V降至1.8V,有效解决了CAN通信问题。绞距选择需兼顾理论计算与现场实测,同时注意与屏蔽层的协同设计。

2401_88858637的博客 186

【WRF-FDDA】观测 Obs nudging 的配置与使用说明(中)

WRF-FDDA

WW、forever的博客 282

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

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。 以下实例演示了如何通过线程解决生产者/消费者问题: /* au...

boguesfei的博客 347

cherry使用MCP协议Streamable HTTP实践

摘要:Streamable HTTP协议是针对传统HTTP+SSE传输方式的改进方案,解决了连接恢复、服务器资源占用和单向通信等问题。该协议基于普通HTTP实现,支持无状态服务器、纯HTTP服务和多轮对话,同时兼容现有基础设施。通过演示展示了服务端和客户端的配置方法,体现了其灵活性和实用性。MCP(多轮对话协议)作为扩展LLM能力的关键技术,代表着未来交互式AI的发展趋势。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 563

【Java】生产者消费者模式

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

weixin_46437504的博客 183

【100%通过率】2023华为od机试C卷【螺旋数组矩阵】C++ 实现

给出数字个数n和行数m(1 < n,m < 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成个一m行矩阵。疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。输入一行,两个整数,空格隔开,依次表示n、m。4.数字不够时,使用单个*号占位。3.填充数字时优先填充外部。1:模拟整个过程打印即可。1.每行数字的个数一样多。小明对这个矩阵有些要求。2.列的数量尽可能少。

MISAYAONE的博客 1249

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java线程(三) 生产者消费者模式-线程同步问题

引言   生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图   存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。 JAVA解决线程模型的三种方式

山的那边 1654

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

生产者消费者模型_面试官:小伙子,你给我简单说一下生产者与消费者模型吧...

前言生产者-消费者模式是一个经典的多线程设计模式。在生产者-消费者模式中,通常有两类线程,即若干个生产者和消费者线程。生产者线程负责提交用户请求消费者线程负责处理生产者提交的任务。内存缓冲区 缓存生产者提交的任务或数据,供消费者使用。开发需要解决的问题:生产者线程与消费者线程对内存缓冲区的操作的线程安全问题。虚假唤醒。测试:/** * 生产者与消费者案例。 * @author */public ...

weixin_39633171的博客 75

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【线程同步】java实现生产者消费者问题与线程中的wait与notify总结

JAVA解决线程模型有三种方式,只讲一种:   1、wait()和notify()

龙遥的世界 1822

java多线程模拟生产者消费者问题,公司面试常常问的题。。。

package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 //Storage仓库//批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产...

weixin_33878457的博客 147

Java 多线程学习之生产者消费者模型:一个较完善的实现

生产者、消费者模型是学习多线程的时候的一个很好的练习模型。该问题专业的说法应为:有限缓冲问题。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。 生产者的作用是生成一定量的数据放到缓冲区中,然后重复此过程。而消费者的作用则是消耗这些数据。问题的关键是要保证生产者不会在缓冲区满时加入数据,消费者也不会再缓冲区空时消耗数据。 解决问题的方法可以

Neil_Li's Blog 2445

java实现生产者消费者问题

引言   生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图   存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。 JAVA解决线

junli_chen的博客 395

操作系统—生产者消费者问题,java项目面试讲解

Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集ava程序员面试必备问题解析及文档学习笔记**

m0_60452141的博客 581

多线程生产者消费者模型

【代码】多线程生产者消费者模型。

weixin_46882669的博客 136

多线程经典问题——生产者消费者(Java实现)

生产者消费者是多线程的一个经典问题,在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。生产者消费者描述的是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品,即生产者和消费者在同一个时间段内共用同一个存储空间。如果在正常情况下不加以协调,当存储空间已满,生产者占用着它,消费者等着生产者让出...

二萌偏的博客 2218

JAVA - 多线程 - 生产者与消费者

多线程同步的典型,消费者生产者模型。

Jianwei Wang 392

生产者消费者问题的java实现

生产者和消费者是多线程经典的问题,生产者和消费者问题的核心是同步的问题,同步问题的核心是要保证同一个资源被多个线程并发访问时的完整性,常用的方法是采用信号或加锁机制,保证资源在任一时刻只能被一个线程访问。这一问题用java来实现的话主要有4种方式。1.wait()/notify();2.await()/signal(); 3.blockingQuene 4.PipedInputStream/pip

longshengguoji的专栏 5200
上一篇: LINUX修改系统时间
ericf1987
博客等级 码龄11年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值