Java线程

Stata中介效应分析实战:从sgmediation安装到Sobel检验结果解读 本文提供了Stata中进行中介效应分析的完整实战指南,重点介绍了第三方命令sgmediation的安装、配置与使用。通过详细案例演示了如何运用Sobel检验分析变量间的间接效应,并深入解读检验结果,帮助研究者厘清自变量影响因变量的具体路径。文章还探讨了Sobel检验的原理、优缺点及结果报告规范,是进行实证研究的实用参考。 阅读详情

1、线程的创建

(1)继承Thread类

public class A extends Thread{
    public static void main(String[] args) {
        A a=new A();
        a.start();

        A a1=new A();
        a1.start();
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i=0;i<=50;i++){
            System.out.println("输出为:"+getName()+"***"+i);
        }
    }
}

部分输出结果如下所示(执行顺序的不确定的):

输出为:Thread-0***43

输出为:Thread-1***21
输出为:Thread-0***44
输出为:Thread-1***22
输出为:Thread-0***45
输出为:Thread-1***23
输出为:Thread-0***46
输出为:Thread-1***24
输出为:Thread-0***47
输出为:Thread-1***25
输出为:Thread-1***26
输出为:Thread-0***48

(2)实现Runnable接口

public class B implements Runnable{
    public static void main(String[] args) {
        B b=new B();
        Thread thread=new Thread(b);
        B b1=new B();
        Thread thread1=new Thread(b1);
        thread.start();
        thread1.start();
    }
    @Override
    public void run() {
        for(int i=0;i<=100;i++){
            System.out.println("输出为:"+Thread.currentThread().getName()+"***"+i);
        }
    }
}

部分输出结果如下所示:

输出为:Thread-0***64

输出为:Thread-1***9
输出为:Thread-1***10
输出为:Thread-1***11
输出为:Thread-0***65
输出为:Thread-1***12
输出为:Thread-1***13
输出为:Thread-1***14
输出为:Thread-1***15

Thread类实际上也是实现了Runnable接口

2、线程状态

(1)新建状态:新创建了一个线程对象,还没有调用start()方法。

(2)就绪状态:当线程有资格运行,但调度程序还没有把它选为运行线程时线程所处的状态。当调用start()方法时,进入就绪状态;在线程运行之后或者从阻塞、等待或睡眠状态回来后也返回到就绪状态。

(3)执行状态:线程调度程序从可运行池中选择一个线程作为当前线程时所处的状态。此时正在执行run()方法。

(4)阻塞状态:由于某种原因放弃CPU使用权,暂时停止运行。阻塞状态有以下三种:

a、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
b、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
c、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状。

(5)死亡状态:当run()方法执行完毕或因异常退出run()方法,此线程结束,不能再调用start()方法。

下面是Thread类中定义的状态:

public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         */
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         */
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         */
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
        TERMINATED;
    }
3、线程调度

(1)优先级:

每一个线程都有一个表示优先级的值,在任意时刻如果有一个线程拥有比当前线程更高的优先级,它抢占低优先级线程的时间片,中断当前线程,开始新的线程。

Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
  /**
     * The minimum priority that a thread can have.
     */
    public final static int MIN_PRIORITY = 1;

   /**
     * The default priority that is assigned to a thread.
     */
    public final static int NORM_PRIORITY = 5;

    /**
     * The maximum priority that a thread can have.
     */
    public final static int MAX_PRIORITY = 10;
Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
    /**
     * Changes the priority of this thread.
     * <p>
     * First the <code>checkAccess</code> method of this thread is called
     * with no arguments. This may result in throwing a
     * <code>SecurityException</code>.
     * <p>
     * Otherwise, the priority of this thread is set to the smaller of
     * the specified <code>newPriority</code> and the maximum permitted
     * priority of the thread's thread group.
     *
     * @param newPriority priority to set this thread to
     * @exception  IllegalArgumentException  If the priority is not in the
     *               range <code>MIN_PRIORITY</code> to
     *               <code>MAX_PRIORITY</code>.
     * @exception  SecurityException  if the current thread cannot modify
     *               this thread.
     * @see        #getPriority
     * @see        #checkAccess()
     * @see        #getThreadGroup()
     * @see        #MAX_PRIORITY
     * @see        #MIN_PRIORITY
     * @see        ThreadGroup#getMaxPriority()
     */
    public final void setPriority(int newPriority) {
        ThreadGroup g;
        checkAccess();
        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
            throw new IllegalArgumentException();
        }
        if((g = getThreadGroup()) != null) {
            if (newPriority > g.getMaxPriority()) {
                newPriority = g.getMaxPriority();
            }
            setPriority0(priority = newPriority);
        }
    }

    /**
     * Returns this thread's priority.
     *
     * @return  this thread's priority.
     * @see     #setPriority
     */
    public final int getPriority() {
        return priority;
    }
每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。

(2)线程睡眠:

让当前线程睡眠有两个方法sleep(long millis)和sleep(long millis,int nanos)

/**
     * Causes the currently executing thread to sleep (temporarily cease
     * execution) for the specified number of milliseconds, subject to
     * the precision and accuracy of system timers and schedulers. The thread
     * does not lose ownership of any monitors.
     *
     * @param  millis
     *         the length of time to sleep in milliseconds
     *
     * @throws  IllegalArgumentException
     *          if the value of {@code millis} is negative
     *
     * @throws  InterruptedException
     *          if any thread has interrupted the current thread. The
     *          <i>interrupted status</i> of the current thread is
     *          cleared when this exception is thrown.
     */
    public static native void sleep(long millis) throws InterruptedException;

    /**
     * Causes the currently executing thread to sleep (temporarily cease
     * execution) for the specified number of milliseconds plus the specified
     * number of nanoseconds, subject to the precision and accuracy of system
     * timers and schedulers. The thread does not lose ownership of any
     * monitors.
     *
     * @param  millis
     *         the length of time to sleep in milliseconds
     *
     * @param  nanos
     *         {@code 0-999999} additional nanoseconds to sleep
     *
     * @throws  IllegalArgumentException
     *          if the value of {@code millis} is negative, or the value of
     *          {@code nanos} is not in the range {@code 0-999999}
     *
     * @throws  InterruptedException
     *          if any thread has interrupted the current thread. The
     *          <i>interrupted status</i> of the current thread is
     *          cleared when this exception is thrown.
     */
    public static void sleep(long millis, int nanos)
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }

        sleep(millis);
    }

线程睡眠到期自动苏醒,并返回到就绪状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行;sleep()是静态方法,只能控制当前正在运行的线程。
(3)线程等待
Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法。
sleep()和wait()的区别:
a.sleep()是Thread类的方法,wait()是Object类的方法
b.sleep()不释放锁,wait()释放锁进入等待此对象的等待锁定池
c.sleep()指定睡眠时间,到期后自动回复,wait()只有此对象发出notify()或notifyAll()才能解除wait()状态(notify并不释放锁,只是告诉此对象可以参与锁的竞争了,但不是马上得到锁,因为锁有可能在别人手里还没有释放)

(4)线程让步

Thread.yield()方法,暂停当前正在执行的线程,使同优先级的线程有执行的机会。

Yield是一个静态的原生(native)方法Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。

yield不能保证使得当前正在运行的线程迅速转换到可运行的状态它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态

(5)线程加入
使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。
(7)sleep()和yield()的区别
        sleep()和yield()的区别):sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
        sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出 CPU 占有权,但让出的时间是不可设定的。实际上,yield()方法对应了如下操作:先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把 CPU  的占有权交给此线程,否则,继续运行原来的线程。所以yield()方法称为“退让”,它把运行机会让给了同等优先级的其他线程
       另外,sleep 方法允许较低优先级的线程获得运行机会,但 yield()  方法执行时,当前线程仍处在可运行状态,所以,不可能让出较低优先级的线程些时获得 CPU 占有权。在一个运行系统中,如果较高优先级的线程没有调用 sleep 方法,又没有受到 I\O 阻塞,那么,较低优先级线程只能等待所有较高优先级的线程运行结束,才有机会运行。 
4、线程组和线程池

Java开发者终极抉择:IntelliJ IDEA vs VS Code —— 4大维度深度对比评测 🔥关注墨瑾轩,带你探索Java的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手!🚀🔥技术宝库已备好,就等你来挖掘!🚀🔥订阅墨瑾轩,智趣学习不孤单!🚀🔥即刻启航,编程之旅更有趣!🚀在Java开发领域,选择合适的集成开发环境(IDE)对于提高开发效率和代码质量至关重要。和(简称VS Code)是两个广受好评的开发工具,各自拥有独特的特性和庞大的用户群。本篇将从多个维度深入探讨这两款IDE对Java开发者来说的优劣,包括但不限于性能、用户体验、生态系统、调试能力、以及特定Java功能的支持等方面。 阅读详情

相关推荐

线结构光三维重建(二):光平面标定与激光轮廓提取的实战优化

本文深入探讨了线结构光三维重建中的光平面标定与激光轮廓提取两大核心环节的实战优化。详细介绍了从棋盘格标定板法到自动化高鲁棒性标定的流程优化,并分享了针对复杂工业场景(如低对比度、高反光表面)的激光轮廓提取组合策略,旨在提升三维重建系统的整体精度与稳定性。

weixin_29057237的博客 333

JAVA线程

虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock,Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化。

互联网底层民工的博客 1万+

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

【线程】Java线程操作

讲述了线程的启动、终止、等待操作,还有线程的各种状态。

telasi2004的博客 2064

vivado:差分信号和单端信号 的相互转换 IBUFDS OBUFDS

FPGA能处理的都是单端信号,但有些输入信号是差分的,这时候就需要把差分信号转为单端信号。

qq_52137732的博客 1万+

数据中心GPU芯片性能参数速查表(Nvidia+国产算力卡)

本文提供了一份数据中心GPU芯片性能参数速查表,涵盖Nvidia与国产算力卡两大阵营。文章详细解读了算力、显存、互连技术及功耗等关键性能指标,并对比了A100、H100、昇腾910B等主流型号,旨在帮助用户根据AI训练、推理等实际场景,做出高效的硬件选型与成本评估决策。

a0b1c2d3的专栏 837

1、【java线程及线程池系列】java线程及线程池概念详解

缓冲队列长度的设置,按照一般的理解应该设置成maximumPoolSize的5倍,因为单个线程在不切换cpu的情况下是单个cpu运算一个线程,corePoolSize设置成和cpu一样的数量,maximumPoolSize设置成cpu的2倍,避免cpu处于空闲状态则直接加入一旦cpu空闲理解执行的线程数量,同时由于cpu的速度较快以及有请求执行的线程加入缓冲队列中减少cpu等待时间,故将缓冲队列设置大一些。线程池存在的目的在于提前创建好需要的线程,减少临时创建线程带来的资源消耗。

alanchanchn的专栏 8万+

OSMDroid 切换地图不更新的问题

用OSMDroid加载Google地图的时候 需要有按钮切换不同图层的地图,如果发现调用了mMapView.setTileSource(ITileSource aTileSource)方法的时候发现地图View没有更新的话,可能是因为两个实例化TileSource对象其子类BitmapTileSourceBase这个类的aName成员变量值一样导致的地图在setTileSource出现不更新问题,...

godoge的博客 1039

Java线程:什么是线程

一 基本概念   多任务:同一时刻运行多个程序的能力。每一个任务称为一个线程。可以同时运行一个以上线程的程序称为多线程程序。   Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线

arredando的博客 3万+

多目标进化算法——NSGA-II(python实现)

NSGA-II(python实现)--最全注释,痴呆能懂--

no___good的博客 5281

49、非合作目标运动参数估计与状态滤波方法研究

本文研究了非合作空间目标的运动参数估计与状态滤波方法。通过分析目标的章动运动特性,建立了运动方程,并分别提出了基于最小二乘法的质心运动参数估计方法和旋转运动参数估计方法。同时,设计了误差状态卡尔曼滤波器(ESKF)用于姿态滤波和角速度估计,以提高估计精度。仿真实验验证了所提方法的有效性,能够准确估计目标的运动参数和状态信息,为在轨服务提供了技术支持。

gpt4scribbler的博客 91

Java多线程——认识线程

Java多线程初阶—— 认识线程

YumunaoDAII的博客 1631

笔试题-2023-芯动-数字IC设计【纯净题目版】

笔试题-2023-芯动-数字IC设计【纯净题目版】

w0shishabi的博客 6397

JAVA线程、线程池解析

是操作系统能够进行的最小单位,它被包含在进程之中,是进程中的实际运作单位。进程是资源分配的基本单位,它拥有自己独立的地址空间和各种资源;而线程是处理机调度的基本单位,它只能和其他线程共享进程的资源,而。线程的上下文切换速度比进程快。

柔丽君的博客 1413

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java创建线程

既然说到线程,在这里就给大家普及一下线程。 线程(Thread): 是操作系统能够进行运算调度的最小单位。 它被包含在进程之中,是进程中的实际运作单位。 一个线程指的是进程中一个单一顺序的控制流。 🥂🥂🥂 其实:进程在我们计算机中我们随时都在使用:按住 Ctrl + shift + esc 这个就是一个进程,在计算机中,线程就是进程中的一个执行单元。 那么,进程是什么呢? 进程:简简单单,我们日常中使用的QQ就是一个进程,进程可以理解为就是一个软件,线程则就是这个软件中的一些功

分享it知识! 7911

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java线程,多线程,线程同步,以及Java回调线程,还有难懂的synchronized

曾几何时,有多少人听到了多线程就某花一紧,听到了线程的同步就感觉昏昏欲睡。那我们今天就聊一聊我的理解。线程是什么?Java中常用到的新建线程的场景?以及多线程和线程池的概念,最牛逼的还是要说清楚线程的同步。我跟人认为在Java的线程开发中,如果没有搞清楚同步的使用和JVM到底是什么机制实现的同步(本文中只针对synchronized的同步做讲解lock另写)。 废话不多说了,什么是线程这个问题大

Kyunchen的专栏 4485

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java线程与内核线程

本篇文章探究下Java线程与内核线程的关系. 在Java中,一个Java的线程对应一个内核的线程,实际的业务代码是由内核线程来执行的,而Java线程只是一个傀儡. 先通过一个简单的实验热热身 import java.lang.Thread; public class Example { public static void main(String[] args) throws Exception { new Thread(new Runnable() { @O

书唐瑞的博客 975

Java 线程机制

Java 的线程机制是 Java 平台的核心特性之一,它允许程序同时执行多个任务。下面我将详细介绍 Java 线程的基本概念、创建方法、生命周期以及同步机制。

weixin_47363690的博客 1876

java线程池停止线程_如何在Java中停止线程?

java线程池停止线程 停止线程 (Stopping a thread) As we know that there are no direct or shortcut ways to stop thread in Java. 众所周知,在Java中没有直接或快捷的方式来停止线程。 As we know thread in java stops when the execution of run...

cumtb2009的博客 5815

Java线程实现和线程状态

写在最前 之前写了ConcurrentHashMap,无论是1.8还是1.7,其中都会涉及锁Synchronized和ReentrantLock;锁的概念是为了解决线程安全问题;所以还是从线程开始写起。 这篇文章主要是写写Java线程的实现和线程的状态,以及上下文的概念,也有一些不完善的地方,会持续查缺补漏。 Java线程的实现 Java线程模型是基于操作系统原生线程模型的实现,在JDK中,win...

diaog的博客 1429

Java线程和OS线程

Java线程和OS线程操作系统实现线程有三种方式内核线程实现用户线程实现用户线程实现 操作系统实现线程有三种方式 内核线程实现 用户线程实现 用户线程加轻量级进程混合实现 内核线程实现 简要说明: 内核线程(Kernel-Level Thread简称KLT)是直接由操作系统内核直接支持的线程,这种线程由内核完成线程切换,内核通过操纵调度器对线程进行调度, 并负责将线程的任务映射到各个处理器上。 每个内核线程可以视为内核的一个分身,这样操作系统就有能力处理多件事情,这种支持多线程的内核就叫做多线程内核

summer_fish的专栏 821

Java笔记——java 线程详解_java线程

此时就用这三个方法来灵活控制。并且jdk官方人员发现,很多线程在等待锁的时候,在很短的一段时间就获得了锁,所以它们在线程等待的时候,并不需要把线程挂起,而是让他无目的的循环,一般设置10次。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行;thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。

a25847a的博客 1342

JAVA线程详解

目录 线程简介 线程实现 JAVA线程调度 JAVA线程的状态 JAVA新建线程 JAVA线程Thread类 AVA线程属性 线程安全 线程简介 操作系统运行一个程序时,会为其创建一个进程,一个进程里可以创建多个线程,线程为操作系统调度的最小单位,每个线程拥有各自的计数器、堆栈、、局部变量等属性,并且可以访问共享变量,CPU在这些线程上高速切换调度执行,早期CPU由单核实现,同...

qq_18581221的博客 7407

java的线程是什么_java的线程是什么

线程是指进程中的一个执行流程,一个进程可以运行多个线程。比如java.exe进程可以运行很多线程。线程总是输入某个进程,进程中的多个线程共享进程的内存。Java中线程是指java.lang.Thread类的一个实例或线程的执行。使用java.lang.Thread或java.lang.Runnable接口编写代码定义、实例化、启动新线程。 (推荐学习:java课程)...

weixin_36372014的博客 410

java线程

进程是程序的一次动态执行过程

J20230301的博客 999

java中操作线程

java中创建、查看。线程暂停,打断。线程状态等使用方法总结。

su_xu_chao的博客 905
上一篇: JVM运行时数据区域
下一篇: MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
yang_9613
博客等级 码龄10年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值