传统实现线程的俩种方式Thread -笔记整理1

Java多种实现异步调用的方式Thread类使用ExecutorService使用CompletableFuture用Spring的@Async注解 Java提供了多种实现异步调用的方式,包括使用Thread类、ExecutorService和Callable/Future接口、CompletableFuture以及Spring的@Async注解等。在实际应用中,可以根据具体需求选择合适的异步调用方式,并注意线程安全、异常处理、结果获取和性能优化等方面的问题。通过合理使用异步调用,可以显著提升系统的并发能力和用户体验。学习教程(传送门)1、掌握JAVA入门到进阶知识(持续写作中……2、学会Oracle数据库用法(创作中……3、手把手教你。 阅读详情

     参考:http://www.fx114.net/qa-126-102338.aspx    


1、实现线程的俩种方式 继承Thread类,实现Runnable接口


2、总结:查看Thread类的run()方法的源代码,可以看到其实这两种方式都是在调用Thread对象的run方法,

      如果Thread类的run方法没有被覆盖,并且为该Thread对象设置了一个Runnable对象,该run方法会调用Runnable对象的run方法。


3、如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递了一个Runnable对象,

      那么,线程运行时的执行代码是子类的run方法的代码,还是Runnable对象的run方法的代码呢?

         答:执行的是子类的run方法。应该子类覆盖了run方法,就没有去调用父类的run方法了。//使用面对对象的思维去思考

4.多线程机制会提高程序的运行效率吗?为什么会有多线程下载呢?

不会,一般来说很有可能程序运行效率还会更慢。 其实你的计算机并没有变快,只是改变了你在服务器的带宽。你去抢了别人的资源。



public class ThreadDemo_01{
/*
查看Thread类run()方法源代码
 private Runnable target;
 
 @Override
      public void run() {
         if (target != null) {
             target.run();
         }
       }
 
*/
public void test1(){
Thread thread=new Thread(){
@Override
public void run() {

while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1:"+Thread.currentThread().getName());

//this代表当前线程对象,但这种方式不好,和另一种线程实现方式作比较会发现不可以这样
System.out.println("2:"+this.getName());
}
}
};

thread.start();
}


public void test2(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1:"+Thread.currentThread().getName());

//Runnable不是线程对象,此时this不代表当前线程,此时使用this就不能获取当前线程,Runnable只是提供了线程对象需要运行的代码
//这也是这种方式比较经常使用原因之一,将线程对象Thread 和 线程所要执行的任务分开,更加符合面向对象编程的思维
//System.out.println("2:"+this.getName());
}
}
});
thread.start();
}

//需要结合源码,Thread内run方法查看,再结合面向对象的思维方式,子类将父类方法覆盖
public void test3(){

/*
  采用面向对象的思维方式去思考,Thread类启动时候,调用Runnable中的run方法,还是子类中的run方法
  答:调用子类中的run方法,因为子类重写了父类方法,将父类的run方法覆盖掉了,不会再找runnable
*/


new Thread(new Runnable() {
@Override
public void run(){
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("runnable:"+Thread.currentThread().getName());
}


}
}){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread:"+Thread.currentThread().getName());
}


};
}.start();
}
}


化工热力学软件:Aspen Plus二次开发_(9).过程控制与动态模拟v1 Aspen Plus 提供了丰富的过程控制工具和方法,可以用于静态和动态过程的模拟和控制策略的开发。通过控制回路设计、动态模拟、优化工具和数据交换接口,用户可以设计和优化各种复杂的控制策略,提高化工生产的稳定性和效率。此外,结合外部软件(如MATLAB、Simulink、LabVIEW等),可以实现更高级的控制策略,如自适应控制和模型预测控制,进一步提升过程控制的精度和灵活性。希望本文的内容能帮助用户更好地理解和应用Aspen Plus中的过程控制功能。 阅读详情

相关推荐

DeepSeek与豆包无缝对接:5分钟搞定智能周报自动化(附完整代码)

本文详细介绍了如何利用DeepSeek与豆包API,快速搭建一个智能周报自动化系统。通过整合豆包平台的工作流数据,并调用DeepSeek大模型进行深度分析与内容生成,该系统能在5分钟内自动抓取、分析多源信息,并生成结构清晰、富有洞察力的团队周报,显著提升工作效率。

weixin_29029995的博客 491

JAVA(3)-Thread的5种方法

Thread的五种创建方式。 public class ThreadTest { //方法1 调用 new Thread().start(); //方法2 调用 new TT().start(); //方法3 调用 new Thread(new c()).start(); //方法4 JAVA8 lambda表达式 new Thread(()->{}).start()) new Thread(()->{ System.out.

aggie4628的专栏 3917

Cadence Design Entry HDL 使用教程

Cadence Design Entry HDL 使用教程 前言 cadence Design Entry HDL是cadence内部集成的一款板级的EDA设计工具,早期叫 concept HDL。其为cadence最早的原配板级电路图绘制工具,只不过由于后来cadence收购了orcad然后就将旗下的capture CIS收入其中,由于后者使用起来上手简单,所以后者更为大家所熟知。虽然大家对...

uio159753的博客 4万+

【多线程】Thread 类及常见方法

1.Thread 类 在Java标准库中,提供有一个Thread,来表示/操作线程。 Thread 类也可以视为Java 标准库提供的API。 创建好的 Thread 实例,其实和操作系统中的线程是一一对应的关系。 操作系统,提供了一组关于线程API(C语言风格),Java对于这组API进一步封装了,就成了Thread类 2.创建线程 2.1继承Thread 类 通过Thread 类创建线程,最基本的做法就是创建子类,继承自Thread ,并且重写run方法 (1)继承Thread 来创建一

m0_60494863的博客 6289

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 344

new Thread(()->{ xxx.xxx }).start();的作用

该代码是Java中的一段匿名内部类的使用,用于创建一个新的线程并启动它。具体来说,'new Thread(()->{})' 创建了一个新的线程,并且这个线程的任务是执行括号中的Lambda表达式。所以这个新线程实际上执行了xxx.xxx的任务。'start()'方法则是启动这个新创建的线程。

weixin_60170500的博客 1559

QMT实盘交易入门:5分钟搞定ETF全球配置策略(附完整代码)

本文详细介绍了如何使用QMT平台实现ETF全球配置策略,从环境准备到策略编写、实盘部署全流程仅需5分钟。通过xtquant库对接交易所接口,提供完整的动量轮动策略代码,帮助投资者快速掌握自动交易技术,优化全球资产配置。

weixin_30675247的博客 334

Java线程实现

Java语言主要提供了两种实现线程的方式:继承Thread类创建线程类和实现Runnable接口创建线程类两种方式。 继承Thread类创建线程类 实现步骤: 定义类继承Thread类,并重写Thread类的run()方法,该run()方法的方法体就 代表了线程需要完成的任务。因此把run()方法称为线程执行体。 创建Thread子类的实例,即创建了线程对象。 调用线程对象的start()...

qq_33763877的博客 325

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

480

Java Thread类的基本用法

简单介绍了Java中Thread类的几个基本的知识点。

Naion的博客 3670

后仿真中《SDF反标必懂连载篇》之 探究 SDF延迟精度 与 timescale 精度问题

本篇文章,同样属于后仿真中的SDF反标系列文章内容之一。今天,将前仿真中的timescale 和 后仿真中 timescale+sdf 延迟数据,进行贯通讲解。不要忽视这部分内容,因为后仿真的成功准确与否,时间精度问题,很重要。为什么?接下来一一讲解。

那么菜的博客 2310

Java 实现异步线程方式Thread 类和 Runnable 接口ExecutorService 和 Callable 接口CompletableFuture

在Java中,异步编程允许我们在不阻塞主线程的情况下执行任务。这提高了应用程序的响应性和性能,特别是在处理I/O操作或计算密集型任务时。本文将探讨几种实现异步线程的方法,并提供代码示例。

王大师企业官方博客 1319

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深度学习工具包 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")

【linux 多线程并发】线程本地数据存储的两种方式,每个线程可以有同名全局私有数据,以及两种方式的性能分析_linux线程本地存储

现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。

2401_86400321的博客 1356

android 蓝牙通讯demo

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

JAVA学习笔记整理八(多线程)

程序、进程、线程 1.    程序:计算机指令的集合,以文件的形式存储在磁盘上 2.    进程:是程序的一次动态执行过程,经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 3.    线程:是进程中的一个单一的连续控制流程,多线程值一个进程在执行过程中可以产生多个线程,这些线程可以同时存在、同时运行     多线程:线程通常是抢

Friday_577的博客 553

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java线程系列---Runnable和Thread的区别、线程同步

Runnable和Thread的区别原文 线程锁原文 鉴于我这篇文章被鄙视了,哈哈哈哈。我决定整理一下资源共享线程同步相关的知识。欢迎鄙视并谈一谈见解。 Java传统多线程的实现有两种方法,继承Thread类或者实现Runnable 在这之前需要让大家从源码上了解一下Thread和runnable这两个类,Thread 也是实现自Runnable,在ru

xiaolongonly的博客 6550

android多线程知识点整理

线程在Android中是个很重要的概念,从用途来说,线程分为主线程与子线程,主线程用于处理界面相关事情,子线程用于执行耗时操作。除了Thread本身外,AysncTask,IntentService及HandleThread在安卓了都扮演着线程的角色。 AysncTask:底层封装了线程池和Handler,方便开发者在子线程中更新ui。 Handler:具有消息循环的线程,内部可以使用Handle...

hzqaqz的博客 426

java线程知识整理(上)

1 并发与并行 并发:指两个或多个事件在同一个时间段内发生。(交替发生) 并行:指两个或多个事件在同一时刻发生(同时发生)   在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。   而在多个 CPU 系统中,则这些可...

qq_40764966的博客 182

传统定时器和线程互斥技术

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 加粗 Ctrl + B 斜体 Ctrl...

欧尔麦特 347

JAVA多线程面试题整理及答案

JAVA多线程面试题整理及答案 什么是线程,进程? 进程:进程就是一段程序的执行过程,进程是表示资源分配的基本单位,又是调度运行的基本单位. 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元 线程:线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位,一个进程可以包含多个线程,...

LilllS的博客 2799

多线程知识整理

123

java复习 142

GD32H759与RT-Thread开发环境搭建及LED线程闪烁实战

实时操作系统(RTOS)是嵌入式工业控制的核心技术,它通过任务调度实现多业务并发处理。基于Cortex-M7内核的高性能MCU,如GD32H759,具备550MHz主频与丰富外设,成为工控领域国产化替代的理想选择。RT-Thread作为开源RTOS,提供完整的线程管理、设备驱动框架和FinSH控制台,能显著降低复杂项目开发难度。在实际开发中,从搭建RT-Thread Studio环境、安装芯片支持包,到通过CMSIS-DAP调试器下载固件,再到使用PIN框架控制GPIO实现LED线程闪烁,形成一套完整的验证

aofan9566的博客 324

Java线程 (使用Callable实现多线程),看完你发现多线程多么简单!(二)

在进行Thread启动多线程的时候调用的是start()方法,而后找到的是run()方法,当通过Thread类的构造方法传递了一个Runnable接口对象的时候,那么该接口对象将被Thread类中的target属性所保存,,如果从代码结构本身来讲,使用Runnable是最方便的,因为其可以避免单继承的局限,同时也可以更好的进行功能的扩充。,用户自定义的线程主体类只是负责项目核心功能的实现,而所有的辅助实现全部交由Thread类来处理。经过一系列的分析之后可以发现,在多线程的实现过程之中已经有了。

2401_84433853的博客 989

@Android程序员:这-5-道刁钻的线程相关题,你会几道?

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的最后,互联网不存在所谓的寒冬,只是你没有努力罢了!《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!oid学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!**

2401_83329718的博客 926

线程的基本概念以及线程的创建方式

       在接下来的一段时间内会学习多线程相关知识,文章的主要内容是参考&lt;&lt;Java多线程编程核心技术&gt;&gt;,作者高洪岩。     所有代码中都用到了slf4j日志,主要代替System.out.print功能,而且所有的代码最后整理放在git,git地址:https://github.com/qiao-zhi/ThreadStudy   1.线程相关概念 1....

weixin_34199405的博客 162
上一篇: Java动态代理的方式解释
下一篇: 传统定时器技术-笔记整理2
马克吐温
博客等级 码龄10年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值