多线程--定时器

C++多线程定时器完整实现 头文件: #pragma once #include #include #include //回调接口 typedef struct ITimerEngineCallBack { virtual bool OnTimerEngineCallBack( DWORD TimerID, DWORD Param ) = 0; }* ITimerEngineCallBackPtr; clas 阅读详情

一.什么是定时器?

计时器(Timer)是一种能够在指定时间或按照指定时间间隔执行任务的机制。它解决了“在什么时候做事”的问题。

定时器是一种实际开发中非常常用的组件:

例如:

  • 数据定期备份
  • 日志文件清理
  • 缓存定期刷新
  • 定时发送报告
  • 系统健康检查
  • 定时同步数据

都会用到定时器

二.java标准库中的定时器

标准库中提供了一个 Timer 类. Timer 类的核心方法为 schedule .
schedule 包含两个参数. 第一个参数指定即将要执行的任务代码(TimerTask类), 第二个参数指定多长时间之后执行 (单位为毫秒).

 public static void main(String[] args)
    {
        Timer timer = new Timer();

        //下面给timer中注册的这个任务,不是在调用schedule的线程中执行的,而是通过Timer内部的线程来负责执行的
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 3000");
            }
        },3000);//这段代码代表程序开始三秒之后开始打印出
        System.out.println("程序开始执行");
    }

我们发现程序并没有结束,为什么呢?
是因为Timer内部有自己的线程,为了保证随时可以处理新安排的任务,这个线程会持续执行,并且这个线程还是一个前台线程 通过jdk的源码我们可以看到  前台线程是可以改为后台线程的 

上述修改为后台线程 下边是Timer的内部线程

 

一个定时器中可以有多个任务的,定时器会根据这些任务设置的时间来合理的分配执行顺序

import java.util.Timer;
import java.util.TimerTask;

//Timer定时器
public class Demo36 {
    public static void main(String[] args) {

        Timer timer = new Timer();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 3000");
            }
        }, 3000);
        System.out.println("程序开始执行");

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 2000");
            }
        }, 2000);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 1000");
            }
        }, 1000);

        System.out.println("hello main");
    }
}

可以看到虽然代码上要先打印hello 3000 但是hello 1000先执行这就是定时器会按照时间合理分配执行顺序

三.自己实现定时器

思路以及相关问题和解决方法

 细节问题:

问题1:线程安全问题

 问题二:阻塞线程(等待任务到时和任务队列为空时)用wait还是sleep

问题三:实现比较方法(小根堆)

 

 以下是完成代码

import java.util.PriorityQueue;
import java.util.concurrent.Executors;

//任务类 (自己实现定时器)
class MyTimerTask implements Comparable<MyTimerTask> {

    private Runnable task;

    private long time;

    public MyTimerTask(Runnable task, long time) {
        this.task = task;
        this.time = time;
    }

    public void run() {
        task.run();
    }

    public long getTime() {
        return time;
    }

    @Override
    public int compareTo(MyTimerTask o) {
        return (int) (this.time - o.time);
    }
}
//自己实现定时器
class MyTimer {

        private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();

        public Object locker = new Object();

        public void schedule(Runnable task, long delay) {
            synchronized (locker) {
                //以入队列的时间为基准
                MyTimerTask timerTask = new MyTimerTask(task, System.currentTimeMillis() + delay);
                queue.offer(timerTask);
                locker.notify();
            }
        }

        public MyTimer() {
            //创建一个线程,负责执行任务队列中的任务(定时器中仅有一个队列)
            Thread t = new Thread(() -> {
                while (true) {
                    try {
                        synchronized (locker) {
                            //取出队首元素
                            while (queue.isEmpty()) {//可以用while 多一次判断 防止notify后队列为空
                                locker.wait();//这里sleep不好,因为会阻塞线程,导致其他任务无法执行
                            }

                            MyTimerTask task = queue.peek();
                            if (System.currentTimeMillis() < task.getTime()) {
                                //当前任务时间,如果比系统时间大,说明任务执行的时机未到
                                locker.wait(task.getTime() - System.currentTimeMillis());
                            } else {
                                task.run();
                                queue.poll();
                            }
                        }
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });

            t.start();
        }
}
public class Demo {
    public static void main(String[] args) {
        //创建定时器
        MyTimer timer = new MyTimer();
        //定时执行任务
        timer.schedule(() -> System.out.println("Hello, 3000!"), 3000);
        //定时执行任务
        timer.schedule(() -> System.out.println("Hello, 2000!"), 2000);
        //定时执行任务
        timer.schedule(() -> System.out.println("Hello, 1000!"), 1000);


    }
}

优化:

上述是就一个扫描线程来执行多个任务,当任务量小的时候还好,任务量一多,效率就极其低下,此时就需要优化,这是我们就可以用到线程池,一个扫描线程把扫描到的任务添加到线程池中来执行提高效率

 java中也有实现ScheduledExcutorService(接口)

ScheduledThreadPoolExcutor(实现类继承上述接口)

 ScheduledExecutorService executor = Executors.newScheduledThreadPool(4);

 executor.schedule(() -> System.out.println("Hello, 3000!"), 3, TimeUnit.SECONDS);

 

 

QT : 多线程使用定时器 方法一: run()函数中初始化和start timer。 void MyThread::run() { timer = new QTimer(); connect(timer,SIGNAL(timeout()),this,SLOT(timerOut())); timer->start(1000); exec(); } void MyThread::timerOut() { qDebug()<<"Current Thread ID:"< 阅读详情

相关推荐

电商客服效率翻倍!手把手教你用影刀RPA+AI搭建智能回复系统(附实战配置)

本文详细介绍了如何利用影刀RPA+AI技术搭建电商智能客服系统,实现24小时在线回复,大幅提升客服效率。通过零代码配置、Excel词库管理和AI语义理解,系统能处理80%常规咨询,响应速度稳定在3秒内,特别适合中小电商降低成本并提升服务质量。

weixin_42520661的博客 550

多线程之定时器 - 详解

本篇了解定时器的方法,参数,并模拟实现定时器,进一步对定时器有了更深的理解,如有错误,请在评论区指正,让我们一起交流,共同进步!

m0_69119792的博客 1189

微信小程序订阅消息实战:如何绕过长期订阅限制实现多次发送(附PHP代码)

本文针对微信小程序开发者无法获取长期订阅消息权限的痛点,提供了一套完整的实战解决方案。通过深入剖析一次性订阅与长期订阅的规则差异,结合巧妙的交互设计、稳健的PHP服务端发送引擎(含高并发处理与失败重试机制)以及授权池管理等高级策略,帮助开发者在合规前提下,构建高可用的消息推送系统,有效提升通知触达率与用户体验。

weixin_29008805的博客 620

多线程应用:定时器

(定时任务)定时器控制任务延时调用,或者周期调用作用定时器的实现方式方式一:Timer方式二:ScheduledExecutorService二. Timer定时器TimerTask继承了Runnable:所以TimerTask是线程任务类。

weixin_53622554的博客 1214

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

Polyworks脚本开发学习笔记(十五)-利用Python连接Polyworks的COM组件

qq_43662503的博客 2501

多线程代码案例之定时器

(1)“定时器”类似闹钟,在指定的时间会触发一定的操作(2)多线程中的定时器,是通过指定一个任务(Runnable),并且加上一个时间(例如:3000ms);这个任务不会立即被执行,而是会等待3000ms后才会开始执行(3)上面这种效果称为:延时执行/定时执行。

2301_77053417的博客 1252

用户存续期价值评估CLV(二) BG/NBD Model python模拟

BG/NBD Model …继续 想象每一个客户有两个硬币,一个“Buy Coin"控制客户购买的概率;一个"Die Coin"控制客户流失、不再购买的概率。 前面假设了客户的交易次数服从泊松过程: 在一年中的每个月,客户都以抛硬币的方式来决定是否购买。我们所观察到的购买次数取决与泊松分布的参数 ????。 %matplotlib inline import numpy as np impor...

weixin_43171270的博客 3426

多线程——定时器

本篇文章会利用多线程的知识来编写一个代码案例——定时器,我会先介绍一下什么是定时器,再来介绍一下我们标准库中的定时器以及操作演示我们标准库中定时器的效果,最后我来手撕出来一个功能上与所演示标准库中定时器效果差不多的定时器,并对其实现的具体逻辑,在代码中进行详细介绍,那么就开始本篇文章介绍的内容吧。

HKJ_numb1的博客 1197

QT+OSG/osgEarth编译之七十六:gltf+Qt编译(一套代码、一套框架,跨平台编译,版本:osgEarth-3.3插件库osgdb_gltf)

通过一套gltf代码和框架,实现osgdb_gltf跨平台编译。 在Qt环境下,集成头文件、库文件,构建跨平台编译的pro文件。 通过构建的一套配置工程,基于Qt Creator IDE,完成跨平台的编译实践。 在Windows、Linux、MacOS等操作系统上进行测试,成功编译,形成的成果(头文件、库文件等)可在不同系统下调用或使用,从而更好地构建跨平台解决方案。 采用的是osgEarth3.3版本。 读者可参考博客中的集成原理,构建不同版本的osgdb_gltf跨平台包。

LuckyHanMo的博客 1800

Dify 第 7 篇 Dify 应用介绍 + 聊天助手&Agent 应用关键点说明

本文介绍了Dify应用的核心概念与使用方法。Dify是基于大模型构建的实际场景应用,提供API、WebApp和易用界面。包含5种应用类型:聊天助手、文本生成、Agent、对话流和工作流。创建方式有模板创建、空白应用和DSL文件三种。重点讲解了聊天助手和Agent应用的关键功能:聊天助手支持提示词优化、知识库引用、文件处理等;Agent应用则强调推理能力、工具调用和任务自动化。文章还详细介绍了应用的调试、发布和管理工具,为开发者提供了全面的应用构建指南。

甘蓝的专栏 1884

多线程案例(三):定时器

多线程案例之定时器

Fug_Lee的博客 1043

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

定时器和多线程

定时器和多线程 1、任务简介 本文分享的是杜老师《工程训练》任务2.3中的普通任务,通过该任务我们可以初步学习Java中定时器与多线程的相关知识,该任务我是在5月完成的,但是一直未将该部分任务上传,故今天对该部分任务的学习进行叙述,详细的思路和代码在下文中进行分享。 2、基本任务和代码 (1)任务1 1)任务内容 完成一个java application应用程序,使用定时器编程,在...

罗思洋的博客 6422

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

【多线程】之 定时器

讲解了多线程的具体案例之一:定时器,说明了如何去从0到1实现一个定时器

fayifenjihuang的博客 1030

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

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

Python多线程和定时器

Python多线程和定时器 多线程 在Python中任务由上到下顺序执行,若需要将多个任务同时执行需要引入多线程。 多线程示例代码如下: import threading runWebVedio(i): ... fun_timer(x): ... th1 = threading.Thread(target= runWebVedio, args=(1,), name="thread1") th2...

小平爱吃肉的博客 2439

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

linux 多线程中定时器的使用

在开发linux mjpg-streamer程序的时候,使用signal,奇怪的是程序竟然退出了。后来读了曹老师的文章,才解决了这个问题。 所以收录到自己的博客里。呵呵 多线程中定时器的使用41865100619 2010-10-14 19:47:29                                                             —— 曹忠明

ljq1203的专栏 1万+

C#多线程实现定时器

     我们在写winfrom时经常会用到定时器,比如客户端通过socket定时向服务器发送检测包等。.netframework提供了一个定时器控件System.Windows.Forms.Timer,使用很方便。     其实通过C#多线程也可以实现定时器功能。我的做法大致为:新开一个线程用于计时,当时间间隔过后用委托变量实现主窗体中的定时函数,再通过调用contro.invoke方法返回主窗体线程执行定时后的操作。     先定义两个类,timer类用于管理和配置定时器,interval_date用于

xfantasy的专栏 1万+

Qt深入浅出(十三)多线程与定时器

多线程​ 我们之前的程序都是单线程运行,接下来我们开始引入多线程。就相当于以前的一个人在工作,现在多个人一起工作。​ Qt中非常有必要使用多线程,这是因为,Qt应用是事件驱动型的,一旦某个事件处理函数处理时间过久,就会造成其它的事件得不到及时处理。​ Qt中使用QThread来管理线程,一个QThread对象,就是一个线程。QThread对象也有消息循序exec()函数,用来处理自己这个线程的事件...

qq769651718的专栏 1万+

Qt多线程及定时器

    Qt开发中,经常使用到多线程,在官方文档中有两种方式实现多线程。一、继承QThread class WorkerThread : public QThread { Q_OBJECT void run() override { QString result; /* ... here is the expensive or ...

qq_19393857的博客 4758

【多线程】定时器

本期内容主要介绍定时器,定时器类Timer的使用以及核心方法schedule(),并介绍如何自己实现一个定时器。

爱编程爱运动的博客 4679

定时器的源码介绍与简单实现——多线程编程简单案例[多线程编程篇(5)]

在现代软件开发中,多线程编程能力已经成为程序员必须掌握的一项核心技能。随着计算机硬件的不断升级,单核CPU早已无法满足复杂应用的性能需求,多核并行运算已成为主流。而多线程正是实现资源最大化利用、任务高效并行执行的基础手段。而本博客是笔者多线程编程的第五篇博客!前面四篇都在下面的URL中,希望能得到大佬们的阅读和指点!!!多线程编程_callJJ的博客-优快云博客本期我们介绍的是定时器,然后翻看并且介绍它的源码。

cjejwe的博客 4029

Java多线程:定时器

多线程案例:定时器

子夜的个人博客 1657

多线程中定时器的使用

                                                                                                     —— 曹忠明  华清远见嵌入式学院讲师         不管是在进程还是线程,很多时候我们都会使用一些定时器之类的功能,这里就定时器在多线程的使用说一下。首先在linux编程中定时器函数有a

farsightliuht的专栏 571
上一篇: 多线程--关于锁的一些知识考点
下一篇: 多线程--CAS原子操作
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值