Java异步编程之Deferred

写了很简单的例子,用来测试 https://github.com/OpenTSDB/async

 

通过例子,可以看出Deferred的使用方式,执行顺序,理解了这个例子,基本上就明白了Deferred的工作机制。

 

Maven依赖:

        <dependency>
            <groupId>com.stumbleupon</groupId>
            <artifactId>async</artifactId>
            <version>1.4.1</version>
        </dependency>

 

Java代码:

import com.stumbleupon.async.Deferred;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import static java.lang.System.out;

public class TestDeferred {
    public static void main(String[] args) throws InterruptedException {
        out.println(Thread.currentThread().getName());

        Deferred<String> deferred = new Deferred<>().addBoth(str -> {
            out.println(Thread.currentThread().getName() + " 1 " + str.toString());
            return str;
        }).addBothDeferring(str -> {
            out.println(Thread.currentThread().getName() + " 2 " + str);

            Deferred<String> d = new Deferred<>().addBoth(s -> {
                out.println(Thread.currentThread().getName() + " 3 " + s.toString());
                return s.toString();
            });

            Executors.newSingleThreadExecutor().execute(() -> {
                out.println(Thread.currentThread().getName() + " started.");
                d.callback("hello");
            });
            return d;
        }).addBoth(str -> {
            out.println(Thread.currentThread().getName() + " 4 " + str.toString());
            return str;
        }).addErrback(str -> {
            out.println(str.toString());
            return str;
        });

        Executors.newSingleThreadExecutor().execute(() -> {
            out.println(Thread.currentThread().getName() + " started.");
//            deferred.callback("hello");
            deferred.callback(new NullPointerException("error."));
        });

        out.println(Thread.currentThread().getName() + " sleeping...");
        TimeUnit.MINUTES.sleep(1);
    }
}

 

输入:

main
main sleeping...
pool-1-thread-1 started.
pool-1-thread-1 1 java.lang.NullPointerException: error.
pool-1-thread-1 2 java.lang.NullPointerException: error.
pool-2-thread-1 started.
pool-2-thread-1 3 hello
pool-2-thread-1 4 hello

 

【教程】BM1684X-32边缘计算盒子 网络配置教程 BM1684X边缘计算盒子网络配置教程 阅读详情

相关推荐

SAP SD信贷管理实战:从配置到风险控制的完整指南(附后台路径)

本文详细解析了SAP SD信贷管理的完整配置流程与风险控制策略,涵盖信贷控制范围设置、风险分级机制及动态控制配置。通过实战案例和后台路径指引,帮助企业实现从客户信用评估到实时监控的全流程管理,有效降低坏账风险并优化资金安全。

3a9bq4r8t2y的博客 212

聊斋java_Deferred,一种Java异步管理机制

场景描述:现在我们考虑用两种方式来实现远程rpc调用:方案一:采用同步阻塞方式,单个线程按顺序做所有的事情,没有什么特别的,不赘述。方案二:采用异步方式,对3和4分别创建一个异步线程去做(这样做可能有点作,只是为了演示,勿喷)。如果采用方案二,最麻烦的地方在于4是依赖3的,意味着4必须等到3返回之后才开始,等到4返回之后,才开始5。可以理解为在3之后还有一个处理链(pipeline),下一个节点根...

weixin_39603397的博客 859

【ORB_SLAM系列4】—— 一文搞定如何在Ubuntu20.04中安装运行ORB_SLAM3(包含ROS版本和非ROS版本)

ORB-SLAM3是一款基于特征点的实时单目SLAM系统,是SLAM领域的研究热点之一。它的核心算法是结合了ORB特征点提取和描述子匹配、单目RGB相机的深度估计、运动估计和地图优化等步骤,能够在实时性和精度之间取得平衡,适用于各种环境下的定位和建图任务。在各种应用领域都有广泛的应用。本教程主要是介绍了关于在ubuntu20.04中运行ORB_SLAM3的所有依赖的库的安装过程,和所遇到的一些报错的解决方法。有什么问题,可以评论区里面交流讨论

2401_82458959的博客 5039

如何使用StumbleUpon:分步指南

Today I begin a series of articles that will teach you how to use StumbleUpon efficiently to maximize traffic to your site, and to all the sites you discover. I assume some of our readers are already ...

culi3118的博客 1051

STM32新手必看:AHT20温湿度传感器实战指南(附完整I2C代码)

本文详细介绍了如何使用STM32驱动AHT20温湿度传感器,包括硬件连接、I2C通信协议解析、驱动代码优化及实战调试技巧。通过对比AHT20与DHT11、SHT30等传感器的性能,突出AHT20的高性价比优势,并提供完整的I2C代码示例,帮助新手快速上手嵌入式传感器开发。

weixin_29163857的博客 292

embedding计算过程

文章目录embedding计算过程(错了跟我讲,我会改)参考示例个人理解过程图示总结(基于pytorch) embedding计算过程(错了跟我讲,我会改) 参考示例 https://www.jianshu.com/p/63e7acc5e890 个人理解过程图示 总结(基于pytorch) 总的来说,就是将独热向量的长度(对应嵌入层的num_embeddings)转变为嵌入层的emdedding_size(而独热向量的维数就是你的数据中一共产生了多少个不一样的词,至少是这么多)。 数据的变化,将二维

纸上得来终觉浅,绝知此事要躬行! 1631

java.lang.NoClassDefFoundError: com/stumbleupon/async/Callback

java.lang.NoClassDefFoundError: com.loopj.android.http.LogHandler 这是由于kuduAPI版本不兼容造成的,换成对应的版本即可。

weixin_44519124的博客 1422

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 82

jQuery.Deferred() 方法

今天在项目中遇到了Deferred()的方法,虽然项目中使用的是dojo,但是其实各个框架都是相通的,以前都没有遇到过,所以今天就在网上找了些资料学习了一下: 定义和用法: $.Deferred() 是一个构造函数,用来返回一个链式实用对象方法来注册多个回调,并且调用回调队列,传递任何同步或异步功能成功或失败的状态。 提示: $.Deferred() 构造函数创建一个新的 Deferred(延迟...

归小超博客 8617

RK3588S开发板实战:手把手教你调试IMX415摄像头(附常见问题排查)

本文提供了基于RK3588S开发板调试IMX415摄像头的完整实战指南。从硬件连接到软件配置,详细解析了设备树(DTS)设置、驱动加载验证及V4L2工具链使用,并附带了常见问题排查方法,帮助开发者快速解决摄像头调试中的典型问题,实现图像采集与性能调优。

assembly8low的博客 592

基于深度学习的智能监考系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

行为检测与识别:能够自动识别考生在考试中的异常行为,如作弊、看手机、交头接耳等。实时监控:在考试期间,系统能够对考生的行为进行实时监控,及时发出警报。用户交互:通过简洁易用的UI界面,便于监考人员进行实时监控、查看警报和视频回放等操作。行为分析与反馈:系统能够识别出考生的违规行为,并提供反馈。本文详细介绍了如何构建基于YOLOv5的智能监考系统,从数据集的准备、YOLO模型的训练,到UI界面的设计与实现,展示了一个完整的深度学习监控系统。

YOLO 781

JDeferred与Java 8 Lambda:现代异步编程的完美结合

JDeferred是一个类似于jQuery的Java异步编程库,它通过Deferred/Promise模式简化了异步代码的编写。当与Java 8 Lambda表达式结合使用时,能显著提升代码的简洁性和可读性,为开发者提供高效的异步编程体验。 ## 什么是JDeferred? JDeferred是一个轻量级的Java库,它实现了Deferred/Promise模式,允许你像处理同步代码一样处理异

gitblog_00724的博客 349

OPENSSL使用方法

预备知识KEY 通常指私钥。CSR 是 Certificate Signing Request 的缩写,即证书签名请求,这不是证书,只是包含申请证书的基本信息。生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。CRT 即 certificate的缩写,即证书。 X.509 是一种证书格式。对X.509证书来说,认证者总是CA或由CA指定的人,一份...

zxm8513优快云博客 1212

JDeferred实战:10个常见异步编程场景的最佳实践指南

JDeferred是一个强大的Java异步编程库,它提供了类似JQuery的Deferred/Promise模式,帮助开发者优雅地处理异步操作。这个Java Deferred库让复杂的异步编程变得简单直观,是提升Java应用性能的终极解决方案。无论你是Java新手还是经验丰富的开发者,掌握JDeferred都能让你的代码更加简洁、可维护。 ## 📋 JDeferred快速入门与安装方法 要开

gitblog_00643的博客 654

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

jdeferred库的使用

如何使用和测试 apply plugin: 'java-library' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) compile 'org.jdeferred.v2:jdeferred-core:2.0.0-beta2' compile 'org.slf4j:slf4j...

情随事迁个人博客 471

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JDeferred完全指南:Java异步编程的革命性Promise库

JDeferred是一个类似jQuery的Java异步编程库,它通过Promise模式简化了复杂异步操作的处理流程。无论是处理网络请求、数据库操作还是耗时计算,JDeferred都能帮助开发者编写更清晰、更可维护的异步代码,彻底告别回调地狱。 ## 为什么选择JDeferred?异步编程的终极解决方案 🚀 在传统Java开发中,处理异步操作往往需要使用回调函数或Future对象,这些方式容易

gitblog_00265的博客 858

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java软件开发会ajax和jquery_Java程序员之JS(一) 之 JQuery.ajax

背景:紧着现在项目的需要,先从JQuery.ajax出发,主要需求是通过 js 调用Java 代码,从而适应现在的项目。先从几个概念开始讲解:一. 什么是DeferredDeferred 对象是由.Deferred构造的, .Deferred被实现为简单工厂模式。它是用来解决JS中的异步编程,遵循 Common Promise/A规范,实现此规范的还有when.js 和 dojo.Deferred...

weixin_29799175的博客 223

彻底搞懂jDeferred:Java异步编程的范式革命

你是否还在为Java异步代码的回调地狱而头疼?是否在寻找一种优雅的方式来处理并发任务、进度通知和错误处理?本文将带你全面掌握jDeferred——这个被誉为"Java版jQuery Deferred"的异步编程库,通过实战案例和深度解析,让你彻底摆脱传统异步编程的困境。 读完本文你将获得: - 掌握Promise(承诺)模式的核心思想与优势 - 学会使用jDeferred处理复杂异步场景的完整流

gitblog_00419的博客 814

从Java Future到Kotlin Deferred:实现无缝异步转换的6种方法

掌握Java与Kotlin协程的混合编程模式,实现从Java Future到Kotlin Deferred的无缝异步转换。涵盖回调适配、挂起函数封装等6种实用方法,适用于多线程迁移、异步任务整合场景,提升代码可读性与性能,值得收藏。

AlgoPerch的博客 612

JDeferred最佳实践:避免常见陷阱的15个实用建议 [特殊字符]

JDeferred是一个强大的Java异步编程库,它为开发者提供了类似JQuery的Deferred/Promise模式实现。如果你正在处理复杂的异步操作、并发任务或者需要优雅地管理回调地狱,JDeferred绝对是你的得力助手!本文将分享15个实用建议,帮助你避开常见陷阱,充分发挥JDeferred的潜力。 ## 📊 JDeferred异步编程流程图 ``` 创建Deferred对象 →

gitblog_00626的博客 744

【Java与Kotlin协程混合编程】:掌握跨语言异步编程的5大核心模式

掌握Java与Kotlin协程的混合编程模式,解决跨语言异步开发难题。涵盖线程切换、回调转换、异常处理等5大核心方法,适用于Android多模块项目协同。提升代码可维护性与性能,值得收藏。

StepLens的博客 341

skills · Codex 技能目录:3 步装好现成技能,再搭出第一个自己的 Agent Skill

skills 是 Codex 的 Agent Skills 目录仓库,内置 39 个 curated 技能与 6 个系统技能,把"教 AI 干某项活"的说明、脚本和参考文档打包成即插即用的文件夹。本文拆解它的目录结构与触发机制,读完可以三步装好现成技能、再搭出第一个自己的技能。 ## 项目速览 - **定位**:Codex 的 Skills Catalog,按 [skills/.curated

gitblog_00993的博客 805

推荐文章:探索异步编程的新境界 - StumbleUpon的Async Library

推荐文章:探索异步编程的新境界 - StumbleUpon的Async Library 项目介绍 在这个追求极致性能的时代,StumbleUpon's Async Library如同一柄锋利的宝剑,为Java开发者开辟了一条构建高效率多线程异步应用的捷径。该库汲取了Twisted框架中著名的异步处理机制灵感(twisted.internet.defer),旨在简化复杂环境下的异步编程挑战,助力开发...

gitblog_00315的博客 505

kotlin协程1:协程的基本概念(包括挂起函数和协程的取消和超时)

协程与并发:线程是通过系统调度多线程同时执行逻辑实现并发提升响应速度等,协程则是将单一任务拆分多个小的任务,每个小任务声明为一个协程,通过协程的同时并发提升整体任务的执行时间,进而提升响应速度。

m0_59162559的博客 957

JDeferred企业级应用:构建可维护的大规模异步系统架构终极指南 [特殊字符]

在现代Java企业级应用开发中,异步编程已成为提升系统性能和可维护性的关键技术。JDeferred作为一款优秀的Java Deferred/Promise库,为开发者提供了强大的异步编程解决方案。本文将深入探讨如何利用JDeferred构建可维护的大规模异步系统架构,帮助您掌握这一重要技术。 ## 为什么选择JDeferred异步编程库? 🤔 JDeferred是一个Java Deferre

gitblog_00300的博客 984

kotlin协程

Kotlin的协程提供了一种更现代、更高效的异步编程方式,它解决了传统Java线程模型中的多个问题,如高资源消耗、复杂的异常处理以及低效的资源利用等,使开发者能够编写出更简洁、更安全、更高效的代码。

超级博客 386
上一篇: 修改Windows XP Home目录
下一篇: Java线程状态
lippeng
博客等级 码龄17年 2粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值