深入理解多线程____javaSE基础回顾

JavaSE核心概念回顾与深入理解 在面向对象编程(OOP)中,类(Class)可以被理解为一种模板,用来定义相同类型对象的属性和方法。而对象(Object)则是根据这种模板创建的具体实例。让我们从一个简单的例子开始,假设我们有一个汽车(Car)类,它有颜色(color)和最大速度(maxSpeed)这样的属性,并且有一个启动(start)的方法。// 定义Car类// Car类的属性// 构造方法// 启动方法。 阅读详情

我是小柴,回顾学习java基础差不多有两个月了,个人感觉学习一门语言最可贵的就是坚持,做任何一件事最大的难题不是入手难易程度,而是自己能不能坚持走下去,我曾经听一位大牛说过,如何把你学到的东西彻底掌握?方法就是把你所学到的东西再传授另一个人,那怎么办呢,我们不可能回家拉着小学文化程度的父母谈JDK虚拟机,拿着计算机概论对着奶奶聊人工智能大数据吧;所以我决定在自己学习完SE基础后养成每周一篇博客的习惯,目的是对自己学过的东西进行复习总结,也对自己学习过程一个监督,一周一篇,一年48篇博客,即使自己日后没有成为互联网大牛也没关系,这也是自己成长路上写实,对于我来说是一种宝贵的财富;闲话不多说马上进入主题——深入浅聊聊我们的多线程.
多线程是javaSE里的重点部分,也是企业hr比较重视的考察类容,由于我前段时间学到了数据库,所以我准备以倒叙的方式从后往前复习基础内容.

首先我们先抛出几个问题:
1.进程与线程的关系
一个进程至少包含一个线程也可以有多个线程,线程是进程中的一个单位(执行路径).
一个程序运行至少有一个进程,一个进程中也可以包含多个线程

2.多线程两种实现方式
继承thread类重写run方法 开启线程子类调用start方法让线程程序执行,告诉jvm调用线程中的run方法
实现runnable接口的实现类,重现run方法将实现类传给thread对象的构造方法,开启线程调用start方法运行run
方法.(每创造出一个thread对象就开启了一个线程;而run方法里的方法体就是我们开启线程后希望线程去单独执行的代码操作)

3.多线程两种实现方式的区别
一个子类是继承父类thread,子类重写run;另一个是创建实现接口runnable的实现类;实现类重写run方法.
区别:第一种thread 的子类封装了线程执行内容在重写run里面;第二种做到对象与方法内容分离开来,更加符合面向对象思想,减少了类与类之间的耦合性,避免的单继承的局限性(推荐第二种)
runnable接口不是线程类,而是线程运行的目标类,想以线程的方式走run方法,必须依靠thread.

4.线程池的原理
开启指定个数的线程 存在一个集合内部等待开启执行,假如任务数大于线程池内线程个数,多余的任务将等待最先开始执行的线程执行结束 继续进行下一个任务

*a:进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,
即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

线程的概念
线程:线程是进程中的一个执行单元(执行路径),负责当前进程中程序的执行,
一个进程中至少有一个线程。一个进程中是可以有多个线程的,
这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程.

什么是多线程呢?
一个程序中有多个线程在同时执行。
一个核心的CPU在多个线程之间进行着随即切换动作,由于切换时间很短(毫秒甚至是纳秒级别),导致我们感觉不出来
感觉就是多个线程在同时运行.
例如:我们电脑的360安全卫士软件,我可以同时操作三个动作,我可以先启动查杀木马的功能,然后启动垃圾清理的功能还启动优化加速,每个功能代表着一个线程,三个功能同时在运行.

线程的运行模式
线程的运行模式
a:分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。

b:抢占式调度
 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。

 大部分操作系统都支持多进程并发运行,现在的操作系统几乎都支持同时运行多个程序。比如:现在我们上课一边使用编辑器,一边使用录屏软件,同时还开着画图板,dos窗口等软件。此时,这些程序是在同时运行,”感觉这些软件好像在同一时刻运行着“。

 实际上,CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。
 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。

创建新执行线程有两种方法。

 a:一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,调用start方法:启动一个新的线程,然后虚拟机调用新线程的run方法 。run方法相当于其他线程的main方法。
 b:另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,调用start方法:启动一个新的线程,然后虚拟机调用新线程的run方法 。

a:
这里写图片描述
这里写图片描述

b:这里写图片描述
这里写图片描述
问题1:为什么要继承Thread,而不直接创建thread对象直接调用start()方法?
thread类描述线程,具有线程应该有的功能,而直接创建thread对象调用start()方式运行的是thread类中的run方法,run里面没有具体操作内容,相当于开启一个没有执行任务的线程,线程不执行具体操作却占着内存空间. 我们这样理解:我花钱请人帮我干活,而我把人家请过来,却不告诉他我要他干什么活,然后他就一直坐在那等你安排任务;工资还是要给人家.

实现接口方式的好处
A:实现接口方式的好处
第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。
实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。
继承Thread类,线程对象和线程任务耦合在一起。
一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。
实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。
编程思想 (降低紧密性或者依赖性,创建线程和执行任务不绑定)
还有一个好处就是:runnable可以实现资源的共享.

线程的生命周期
新建(New):开启新的线程
可执行(Runnable):线程等待cpu执行
运行(Running):线程正在运行
阻塞(Blocking):线程的cpu资源被其他线程抢占进入待命状态.线程的sleep() wait()方法均可以导致线程进入等待状态.
死亡(Dead):线程执行的代码操作执行完毕,线程结束.

什么是线程池
线程池用于存贮多个线程,存储的线程执行不同的线程任务,执行结束后继续留在线程池中等待执行新的任务操作.线程池大大节省了系统内存,提高了内存的使用效率.

创建线程池
这里写图片描述

实现线程的Callable接口方式
/*
* 实现线程程序的第三个方式,实现Callable接口方式
* 实现步骤
* 工厂类 Executors静态方法newFixedThreadPool方法,创建线程池对象
* 线程池对象ExecutorService接口实现类,调用方法submit提交线程任务
这里我们用一个案例简单演示一下callable接口
<创建接口callable实现类>
创建接口callable实现类
<创建线程池>
这里写图片描述

线程安全问题
首先我们来了解一下什么是线程安全问题;安全问题志发生在多线程中,单线程不存在安全问题;为什么呢? 当开启多个线程处理同一个对象中的数据时,会发生的一种问题.
此时小柴举个例子: 我们有3个人去食堂打饭,食堂打饭点我们看成一个共享对象,打饭点里面的便当我们看成对象的数据;三个同学我们看成三个线程,我们去食堂的任务就是去吃饭,这个任务就是我们run方法,假如打饭点正好只有三分便当,而我们的理想的效果就是三个同学去食堂都要吃到便当,这时,第一位同学拿到便当后假设他在0.5s内把便当吃完又插队到第二位同学身后又拿走了一份便当吃掉了,而第三位同学此时没有便当可以分配,所以第三位同学中午没有吃到饭,这时的结果就偏离了我们的预期效果,这种现象称之为安全问题.

Synchronized 关键字
为了解决多线程所出现的安全问题;我们引入一个关键字Synchronized ;为了防止共享对象在并发访问出现错误
,确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。Java中的“线程同步”基于“对象锁”的概念.

同步代码块
同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能够保证线程安全。

如何理解同步代码块?
我们再以上面的例子做出解释: 由于发现部分同学会有插队行为,我们推出一种方案,发明一种打饭专用的渠道;一次只能进入一个同学,进入渠道打饭的同学拿到一个锁,用锁将进入渠道的入口锁起来,等待他拿到便当后 再把锁打开离开渠道,锁将放回原位,下一个进入渠道的人可以再次拿到锁,这时后面的人就不能插队保证到了每位同学都能拿到便当.

让我们来用代码具体演示下同步代码块的操作

这里写图片描述

1、wait和sleep的区别
sleep是thread类的方法,wait是object类的方法
sleep有睡眠时间限制 wait等待没有时间限制
wait释放同步锁 sleep不释放同步锁
wait notify notifyall只能在同步代码块类使用 而sleep可以在任意位置使用
(补充)wait() notify()方法必须是锁对象才能调用!

JavaSE项目实战集:从入门到精通 面向对象编程(OOP)是Java编程的基础,而类和对象是OOP的核心概念。在Java中,类是创建对象的蓝图或模板,它定义了对象的属性和行为。对象是类的实例,即根据类的定义创建的具体实体。类的定义使用关键字class,后跟类名和类体。类体中可以定义属性(变量)和方法(函数)。例如,定义一个Person类:// 定义属性// 构造方法// 方法对象的创建使用new关键字后跟类名和括号,括号内可以传递参数给构造方法。 阅读详情

相关推荐

全面掌握JavaSE:从基础知识到高级特性

Java语言自1995年问世以来,就以其平台无关性、面向对象、安全性以及跨平台的特性,成为全球最流行的编程语言之一。在IT行业内,Java不仅是构建企业级应用的首选语言,同时也是诸多新技术和框架的基石。本章将带领读者回顾Java语言的基本概念、语法和特性,为后续章节的深入学习打下坚实的基础。在Java中,类是创建对象的蓝图或模板。类可以包含属性(成员变量)、方法(成员函数)、初始化块、内部类(nested class)等。对象是根据类定义所创建的实例。

weixin_42591413的博客 1022

JavaSE——多线程

多线程 一、多线程概述 进程与线程 进程是一个应用程序(1个进程是一个软件)。 线程是一个进程中的执行场景/执行单元。 一个进程可以启动多个线程。 对于java程序来说,当在DOS命令窗口中输入:java HelloWorld 回车之后。会先启动JVM,而JVM就是一个进程。JVM再启动一个主线程调用main方法。同时再启动一个垃圾回收线程负责看护,回收垃圾。最起码,现在的java程序中至少有两个线程并发,一个是垃圾回收线程,一个是执行main方法的主线程。 进程和线程的关系 进程可以看做是现实

weixin_56341892的博客 491

深入JavaSE:核心概念与实践笔记

Java作为一门跨平台的编程语言,拥有强大的社区支持和丰富的生态系统。它从诞生之初就秉承着“一次编写,到处运行”的理念,广泛应用于企业级开发和移动应用。掌握Java的基础知识是进入IT领域的第一步。Java允许开发者定义自己的异常类型,从而更好地表达程序中可能出现的特定错误情况。自定义异常通常继承自Exception类或其子类。创建自定义异常时,应当添加构造方法,以支持异常信息的传递和异常链的建立。// 定义一个自定义异常类// 在业务逻辑中使用自定义异常try {

weixin_36212459的博客 1020

Java中的多线程你只要看这一篇就够了

引 如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。 很多人都对...

aikuangchou2298的博客 5199

JavaSE核心知识点阶段测试与自我评估

在面向对象编程中,类是创建对象的模板或蓝图。类定义了对象将拥有的属性(成员变量)和行为(方法)。Java 中创建类的基本语法如下:// 成员变量int age;// 构造方法// 方法在上述代码中,ClassName是一个类的定义,其中包含两个成员变量name和age,一个构造方法,和一个introduce方法。构造方法用于创建对象时初始化成员变量,而introduce方法则用于输出对象的基本信息。

weixin_33239721的博客 987

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 118

JAVASE之多线程初识

多线程: 进程:进程指正在运行的程序,确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序.   简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程. 多线程:即就是一个程

YoungLee16的博客 567

群晖Git Server权限配置全攻略:如何让普通用户(非admin)也能安全提交代码?

本文详细解析了群晖Git Server权限配置方案,特别针对普通用户(非admin)安全提交代码的需求。通过SSH服务配置、精细化用户权限管理及仓库创建自动化脚本,实现在DS218+等群晖NAS设备上的高效代码协作,同时确保系统安全。

weixin_42528780的博客 466

如何学好Java。先从完整的了解JavaSe基础开始

大家好,今年是我工作的第七个年头,也是我接触Java的九周年。从出来工作到现在,做了四年开发三年技术培训老师。一直在思考着如何,让大家更简单的学习,更完美的学习Java。今天在2018年3月22日,踏出了实际的第一步。后续会给大家陆续更新,也会在这里给大家分享我的上课视频。只希望能帮助到更多想学习Java却无从下手的人们。以下是我个人的JavaSe基础知识图,大家先了解一下。后续会跟据知识图给大家...

李端的博客 4525

【项目立项管理、项目整合管理】30天通过软考高项-第二天

①项目或阶段的概述;②范围目标、范围的评估标准,证明达到完⼯标准的证据;③质量目标、项目和产品质量的评估标准、相关核实信息和实际里程碑交付日期以及偏差原因;④成本目标,包括可接受的成本区间、实际成本,产⽣任何偏差的原因等;⑤最终产品、服务或成果的确认信息的总结;⑥进度计划目标,包括成果是否实现项目预期效益:如果在项目结束时未能实现效益,则指出效益实现程度并预计未来实现情况;

weixin_42520723的博客 1003

《手把手教你YOLOv9实战》,改进专栏目录

为了提供友好的操作效果,本专栏将会手把手搭建可视化界面,我将用PyQt5 搭建一个可视化界面,可视化界面能够实现基本的图像加载与检测功能,如支持视频、摄像头,还支持更换不同的 YOLOv9 模型,并适应不同领域(如口罩检测系统、人脸检测系统、工业缺陷检测系统等),界面灵活、功能强大。通过YOLOv9加以改进设计,形成新的算法框架,一起水科研和论文,专栏会一直持续更新中,本专栏适合目标检测、分割、分类。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2161

(72)Java SE 结束:大纲总结

Java SE 全部内容回顾: 1.8钟基本数据类型 char long float int byte boolean double 2.3钟引用类型 String 数组 类 3.运算符 4.if else ;switch语句 5.键盘输入Scanner 6.循环语句 7.项目1:家庭收支 8.数组 二维数组 Arrays.sort(); 9.冒泡排序 1...

Ricardo__Lu的博客 221

【Simulink教程案例18】基于simulink的基础OFDM+64QAM发射接收链路仿真

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的。

FPGA/MATLAB学习教程/源码/项目合作开发 1990

【Java学习】倒计时59天——JavaSE回顾(2021.4.8)

参考链接:JavaSE阶段回顾总结 1、数据类型 其中如果在数值计算中不允许有任何舍入误差,就必须用bigDecimal 内部类: 2、类型转换 强制类型转换(instanceOf如果能对比就能强转) 自动类型转换 常用类: 3、集合框架 负载因子为什么是0.75?不是1,不是0.5? 4、I/O流 5、多线程 6、网络编程 7、注解与反射 —————————————————————————————————— 需要回顾的知识点有: 1、转义字符 2、进制转换 3、构造方法(无参,有参

历乱的日记簿 138

【unity游戏开发入门到精通——UGUI】文本控件 —— TextetMeshPro新文本控件(TextMeshPro - Text(UI)和TextMeshPro - Text)

文本组件是UGUI中最常用的组件,它的作用是对文本数据进行处理并显示。UGUI的文本组件可以分两为种——Text旧文本控件、TextMeshPro新文本组件。本文主要是介绍TextMeshPro新文本控件,而TextMeshPro新文本控件又可以分为两种——TextMeshPro - Text(UI)和TextMeshPro - Text。TextMeshPro是Unity收购的一个第三方插件,现在已经自动内置到编辑器中,只要使用一次就会自动导入到工程。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3770

SAP-ABAP:SAP创建CDS视图(SQL语句创建)实例详解

通过Eclipse和ADT创建CDS视图是SAP开发中的一项重要技能。CDS视图不仅简化了数据建模,还提供了高性能和灵活性。掌握CDS视图的开发和使用,可以帮助你更好地支持SAP S/4HANA和Fiori应用的开发。

baidu_35680696的博客 1825

JavaSE——线程—死锁,线程通信

见:JavaSE-死锁-线程通信-线程池.xmind。

qq_59737375的博客 1642

(SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验

(SEED-Lab)Buffer Overflow Vulnerability Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录一、实验目的二、实验步骤与结果2.1 环境初始化2.2 Task1 运行shellcode2.3漏洞程序2.4 Task 22.5 Task 3: ASLR2.6 Task 4: Stack Guard2.7 Task 5:不可执行栈三、参考文献 一、实验目的 理解缓冲区溢出攻击的原理以及如何实施攻击 理解针对缓冲区溢出的防御措施

lunan的博客 8983

Java教程,Java基础教程,2020年全新Java基础学习教程

学习任何一门编程语言,首先要学习的是基础语法,开启Java学习的第一步,当然就是深入掌握计算机基础、编程基础语法,面向对象,集合、IO流、线程、并发、异常及网络编程,这些我们称之为JavaSE基础。当你掌握了这些内容之后,你就可以做出诸如:电脑上安装的迅雷下载软件、QQ聊天客户端、考勤管理系统等桌面端软件。 点击图片放大查看: 学习资源: 零基础小白自学Java基础教程 讲义资料源码网盘 提取码:egtf 时代在变化,Java的知识也在不断的变化,今天分享一下2020年Java全新的基础教程.

qq_46316635的博客 344

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

javaSE高级-JUC并发编程(回顾)

文章目录1、什么是JUC2、进程和线程2.1、深入理解进程和线程2.2、扩展:java可以开启线程吗?2.3、并发与并行2.4、线程的状态2.5、wait和sleep3、Lock锁3.1、开发中错误开启线程的方法3.2、传统的 synchronized3.3、Lock锁3.4、Synchronized 和 Lock4、生产者和消费者4.1、synchronized版本4.2、存在问题(虚假唤醒)4.3、Lock版4.4、Condition的优势5、8锁的现象6、集合类不安全7、Callable8、Count

锋声的博客 309

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JavaSE『学习笔记』

本教程以 JDK8 为主,新版本与新特性以介绍与使用为辅。

小哞^同^学的技术博客 1238

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

多线程学习之深入理解Java多线程与并发编程

上篇博客回顾:1.多线程之间如何通讯 多个线程在操作同一个资源,但是操作的动作不同。2.wait、notify、notifyAll()方法wait()、notify、notifyAll()定义在Object类中方法,可以用来控制线程的状态这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。 2.1.如果对象调用了wait方法就会使持有该对象的线程把该对象的控...

coderWang 1983

一文带你深入理解【Java基础】· 注解

Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!!!如果小哥哥小姐姐们对我的文章感兴趣,请不要吝啬你们的小手,多多呀!❤❤❤爱你们!!!目录【往期回顾】1. 注解概述1.1注解概述从JDK 5.0开始, Java增加了对元数据的支持,也就是Annotation(注解)其实就是代码里的特殊标记,这些标记可以在编译,

麟-小白的博客 1214

Android开发必须要会,搞懂这些直接来阿里入职

这篇文章最近很火,我也有一些自己的看法:现在去很多公司面试,除了你具备基本的能够写一个高性能app的能力后,一般都会在自己的app里面加一些现有的相对较666的技术,这些技术我们称之为开源框架。 比如,我们以前木匠做一个桌子,我们需要把木头削成木板,然后把木板拼成桌面,然后再去用同样的方式做桌子的腿;现在,我们只需要买做好的桌子板和做好的桌子腿,然后我们就可以用他们拼接就可以自己做一个桌子了。 所以,现在开放代码已经不再需要你去锯木头了,你只需要拿着一个SDK就可以实现一个功能了,那么这个就是我们的开源技术

bv2215的博客 204

视频教程-Java网络编程精讲-Java

Java网络编程精讲 拥有10年大数据以及Java相关系统架构及教学经验,J...

weixin_31031053的博客 387

JavaSE进阶04:API中常用工具类

系列文章目录 day01:Java概述和基础语法 文章目录系列文章目录MathSystemObjectObject类的toString方法Object类的equals方法equals()面试题Objects Math 1、Math类概述 Math 包含执行基本数字运算的方法 2、Math中方法的调用方式 Math类中无构造方法,但内部的方法都是静态的,则可以通过 类名.进行调用 3、Math类的常用方法 方法名 方法名 说明 public static int abs(in

XXXZhy丶Blog 711
上一篇: JAVA环境变量的配置-------新手入门第一步
下一篇: String类自定义trim()方法
Java小柴
博客等级 码龄8年 46粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值