Spring源码 | SchedulingConfigurer / TaskScheduler / ThreadPoolTaskScheduler 自定义任务调度器实现与全链路源码分析

ThreadPoolTaskScheduler轻量级多线程定时任务框架 面对一些小的功能需求点,如果需要非常灵活的进行处理定时任务处理,但是又因为你的需求需要使用到页面进行定时任务配置,显然使用Spring注解定时任务,无法满足你,这时你想到了xxl-job 或者 quezy等定时任务框架,但是过于繁琐,可能成本较大。那么本文将要解决你的问题。ThreadPoolTaskScheduler 内部方法非常丰富,本文实现的是一种corn表达式,周期执行schedule(Runnable task, Trigger trigger) corn表达式,周期执行。 阅读详情

ThreadPoolTaskScheduler 是 Spring Framework 提供的一个任务调度器,用于在多线程环境下执行定时任务。它基于线程池来管理任务的执行,可以根据配置的参数来控制线程池的大小、任务队列的大小等,从而灵活地控制任务的并发执行情况。

ThreadPoolTaskScheduler 的运行原理主要包括以下几个关键点:

线程池管理:ThreadPoolTaskScheduler 使用 ThreadPoolExecutor 作为底层的线程池管理器。通过配置 corePoolSize 和 maxPoolSize 可以控制线程池的核心线程数和最大线程数。当任务数超过核心线程数时,新任务会被放入任务队列中等待执行,直到队列满后才会创建新的线程执行任务,直到达到最大线程数。

任务调度:ThreadPoolTaskScheduler 使用 ScheduledExecutorService 来实现任务的调度功能。它可以执行延迟任务和周期性任务,通过调用 schedule 和 scheduleAtFixedRate 等方法来提交任务,然后由线程池中的线程来执行。

任务队列管理:ThreadPoolTaskScheduler 使用 BlockingQueue 来管理任务队列。可以通过配置 queueCapacity 来控制任务队列的大小,以避免任务过多导致内存溢出或性能下降的问题。

异常处理:ThreadPoolTaskScheduler 提供了异常处理机制,可以通过设置 errorHandler 属性来处理任务执行过程中的异常情况。默认情况下,异常会被打印到日志中,但也可以自定义实现 ErrorHandler 接口来处理异常。

1. SchedulingConfigurer

在开始介绍ThreadPoolTaskScheduler ,先从SchedulingConfigurer入手,任何自定义定时任务调度器,都要实现这个接口。

1.1 SchedulingConfigurer包括了一个方法configureTasks。

1.2 configureTasks 传入了一个ScheduledTaskRegistrar类型的对象,,通过这个对象可以配置任务调度器的各种属性。ScheduledTaskRegistrar包含了一个方法setScheduler。

1.3 可以调用 setScheduler 方法设置自定义的任务调度器实现,也可以调用 addTriggerTask 和 addCronTask 方法添加触发器任务和 cron 表达式任务。

1.4 setScheduler 方法传入了一个当前类的TaskScheduler对象。

2. TaskScheduler

askScheduler 接口是 Spring Framework 提供的一个任务调度器接口,用于管理和执行任务。

2.1 TaskScheduler接口的私有方法

schedule(Runnable task, Trigger trigger):使用给定的触发器安排一个单次执行的任务。触发器定义了任务的执行时间。

schedule(Runnable task, Date startTime):安排一个在给定的开始时间执行的任务。

scheduleAtFixedRate(Runnable task, Date startTime, long period):安排一个在给定的开始时间开始执行,然后以固定速率执行的任务。

scheduleAtFixedRate(Runnable task, long period):安排一个以给定的固定速率执行的任务,初始延迟为0。

scheduleWithFixedDelay(Runnable task, Date startTime, long delay):安排一个在给定的开始时间开始执行,然后在每次执行结束和下一次执行开始之间存在给定延迟的任务。

scheduleWithFixedDelay(Runnable task, long delay):安排一个在给定的初始延迟后开始执行,并在每次执行结束和下一次执行开始之间存在给定延迟的任务。

这些私有方法是用于实现任务调度功能的核心方法,通过这些方法可以实现不同类型的任务调度。

注:这里涉及到一个具体的方法schedule,这里在后续实现类会介绍到。

2.2 TaskScheduler接口实现类

常见的几种 TaskScheduler 接口的实现方法包括:

ThreadPoolTaskScheduler:基于线程池的任务调度器实现,可以通过配置线程池的参数来控制任务的并发执行情况。

ConcurrentTaskScheduler:简单的任务调度器实现,直接使用当前线程来执行任务,适用于不需要并发执行的任务场景。

ScheduledExecutorTaskScheduler:基于 ScheduledExecutorService 的任务调度器实现,类似于 ThreadPoolTaskScheduler,但没有线程池的管理功能。

CustomTaskScheduler:自定义的任务调度器实现,通过实现 TaskScheduler 接口的方法来实现自定义的调度逻辑,可以根据具体的业务需求来定制任务调度器的行为。
 

3. ThreadPoolTaskScheduler

3.1 ThreadPoolTaskScheduler继承了ConcurrentTaskExecutor

3.2 该类当中有一个私有成员scheduledExecutor,他的初始化如下:

3.3 继续跟踪:

3.4 可以看到,最后初始化了一个指定核心线程数的线程池,任务调度就是通过set线程池变量来实现的。

4. 自定义任务调度demo

以上介绍了SchedulingConfigurer / TaskScheduler / ThreadPoolTaskScheduler源码调用流程,以下是一个简单的示例,展示了如何实现 SchedulingConfigurer 接口来配置任务调度器。

@Configuration
@EnableScheduling
public class MySchedulingConfigurer implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(
            () -> {
                // 执行任务逻辑
            },
            triggerContext -> {
                // 定义任务触发规则
                CronTrigger cronTrigger = new CronTrigger("0 0/5 * * * ?");
                return cronTrigger.nextExecutionTime(triggerContext);
            }
        );
    }

    @Bean(destroyMethod="shutdown")
    public ThreadPoolTaskScheduler taskExecutor() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("my-scheduled-task-");
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        scheduler.setAwaitTerminationSeconds(60);
        return scheduler;
    }
}

5 如何提交任务(重点★★★★★)

5.1 ok,还记得2.1节,在TaskScheduler接口当中,有一个方法schedule吗!

我们还是以ThreadPoolTaskScheduler实现类为例。

5.2 追踪开始

注意,这里调用了ReschedulingRunnable的schedule方法!!!

5.3 观察schedule的实现过程。

this.trigger.nextExecutionTime(this.triggerContext);根据当前的触发器 (trigger) 和触发器上下文 (triggerContext) 计算下一次任务执行的时间,并将结果赋值给 scheduledExecutionTime。

整个方法是根据触发器计算下一次任务的执行时间,然后使用线程池调度器安排任务在计算出的时间执行。

5.4 schedule方法下面,重写了run方法。

记录任务实际执行的时间。
调用父类的 run 方法,执行任务的主要逻辑。

记录任务执行完成的时间。

使用 triggerContextMonitor 对象进行同步,确保多线程环境下的安全访问。

this.triggerContext.update(this.scheduledExecutionTime, actualExecutionTime, completionTime);更新触发器上下文 (triggerContext),将预定执行时间、实际执行时间和完成时间传入,以便后续触发器的计算和任务状态的更新。

if (!obtainCurrentFuture().isCancelled()) { schedule(); }:如果当前任务的 ScheduledFuture 对象未被取消,则重新调度任务,即再次调用 schedule() 方法安排下一次执行。

这个方法的作用是在任务执行完成后,更新触发器上下文,并根据当前任务的状态决定是否重新安排下一次执行。

5.5 父类的 run 方法

这个类的作用是提供一个可以处理错误的 Runnable 包装类,通过在 run 方法中捕获异常并调用错误处理器来处理异常,从而保证任务执行过程中的异常不会导致整个程序崩溃,并且可以在异常发生时进行相应的处理。

我们在实际实现过程中,可以自定义自己的Runnable 实现方法。

public class MyRunnable implements Runnable {

    private String message;

    public MyRunnable(String message) {
        this.message = message;
    }

    @Override
    public void run() {
        System.out.println("Executing MyRunnable with message: " + message);
        // 添加自己的逻辑代码
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable("Hello, world!");
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

6 自定义任务调度器实现全流程demo(仅作参考)

@Configuration
@EnableScheduling
public class MySchedulingConfigurer implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(
            new MyRunnable("Hello, world!"),
            triggerContext -> {
                // 定义触发器,每隔一段时间执行一次
                CronTrigger cronTrigger = new CronTrigger("0/5 * * * * ?");
                return cronTrigger.nextExecutionTime(triggerContext);
            }
        );
    }

    @Bean(destroyMethod="shutdown")
    public ThreadPoolTaskScheduler taskExecutor() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        return scheduler;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(MySchedulingConfigurer.class);
        context.refresh();
    }
}

看了一下午spring源码,轮子造起来!!!

基于SchedulingConfigurer实现多定时任务注册及动态修改执行周期 基于SchedulingConfigurer实现多定时任务注册及动态修改执行周期 Java中实现定时任务有三种方式: 1.JDK自带的Timer 2.Spring中的Spring Task 3.借助第三方的Quartz 工作中常用的是Spring Task和Quartz,今天主要用一下Spring Task。 Spring Task有两种实现方式: 1.@Scheduled(cron表达式) 2.基于SchedulingConfigurer注册定时任务 这两者的区别主要有 1.@Scheduled不支持动态 阅读详情

相关推荐

Spring中利用SchedulingConfigurer实现动态定时任务配置

在现代的软件开发中,定时任务是一项至关重要的功能,它们使得我们能够按照预定的时间执行特定的任务,从而实现自动化、周期性的操作。在Spring框架中,定时任务的管理和配置是一项常见的任务。本文将介绍如何利用Spring框架中的`SchedulingConfigurer`接口来实现动态定时任务配置,以及其在实际项目中的应用。

fudaihb的博客 3629

springboot定时任务—实现SchedulingConfigurer接口做定时调度(一)

定时任务在平时的工作中是很常见的,怎么有效的管理这些个定时任务呢?有的用配置文件,而我却喜欢用可视化列表管理,其实原理也就是把所有的定时任务都放到表里去管理,在项目启动的时候把这些个定时任务扫描到定时任务里即可!废话不多说了,先看看怎么去实现吧。其实SchedulingConfigurer实现方法很简单,只需要实现SchedulingConfigurer并重写configureTasks方法,在启动类必须加上@EnableScheduling注解即可。这里我就是做个封装和优化,让定时任务更好管理,原理还是这

Demon丶冷漠 1万+

SchedulingConfigurer教程,怎么使用Spring自带的可扩展定时任务调度接口

是 Spring 框架中的一个接口,用于配置任务调度(scheduling)的相关设置。在 Spring 中,任务调度通常通过 Spring 的任务调度模块(Task Scheduling)来实现,其中就涉及到一些配置和定制的需求。SchedulingConfigurer 接口提供了一种灵活的方式来定制任务调度的行为。该接口定义了一个方法:这是一个函数式接口,通过实现这个接口,你可以在应用程序启动时配置任务调度的行为。你可以使用这个接口来添加、修改或删除任务,也可以配置任务执行的线程池等相关设置。

十三月的博客 1141

SchedulingConfigurer

下面定义实际的动态线程池处理方法,这里采用抽象类实现,将共用逻辑封装起来,方便扩展。List<T> listTaskInfo():获取所有的任务信息。void doProcess(T taskInfo):实现实际执行任务的业务逻辑。void configureTasks(ScheduledTaskRegistrar taskRegistrar):创建 DSContainer 对象,并创建一个单线程的任务定时执行,调用 scheduleTask() 方法处理实际逻辑。

杜海的博客 5295

DAC8568 Controller

DAC8568 ControllerDAC8568 简介串行接口三级目录 DAC8568 简介 PIN Description Name Description LDAC‾\overline{LDAC}LDAC load DACs SYNC‾\overline{SYNC}SYNC 低电平有效,电平触发控制, 该输入为输入数据的帧同步信号. 当SYNC为低,使能DAC内输入移位寄存器,并在随后的所有时钟沿采样数据。 在第32个时钟之后,DAC更新输出。 若不到32个时钟SYNC被置高(即

u010170039的博客 5128

SAP系统中PP模块全配置文档

配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。

yanzibing99的博客 1889

SpringBoot使用SchedulingConfigurer实现多个定时任务多机器部署问题

SpringBoot使用SchedulingConfigurer实现多个定时任务多机器部署问题

小志的博客 4106

二叉树随机漫步

元旦快乐! 学习到中本聪bitcoin的文章的calculation部分的时候,出现了binomial random walk,不是很明白什么是random walk。发现这个文章写的很好:https://blog.youkuaiyun.com/fireguard/article/details/16111603 随机漫步,也叫随机游走,最早是物理学中做"布朗运动"的微观粒子的运动形态来形成的一个模型,布朗运...

gjq5464的博客 1737

在 SpringBoot 中使用 ThreadPoolTaskScheduler 实现定时任务

在 SpringBoot 中使用 ThreadPoolTaskScheduler 来实现定时任务。

Wayfreem的博客 2万+

Aruco标签定位、测距、三维位置估算 opencv应用

摄像头要一开始对准aruco标签才开始运行。+ 相机标定文件(参考我的上篇文章)+ aruco标签6*6。

dgut_guangdian的博客 4221

【Python机器学习实战】 | 基于PCA主成分分析技术读入空气质量监测数据进行数据预处理并计算空气质量综合评测结果

主成分分析(Principal Component Analysis, PCA)是一种常用的机器学习和数据分析技术,用于降低数据维度、识别数据中的模式、发现变量之间的关系等。

一伦明悦的博客 1261

Spring boot实现定时任务三:实现SchedulingConfigurer接口(动态定时任务)

目录一、实现方法二、实现过程1.创建定时任务执行周期表(sys_cron)2.代码实现2.1创建spring boot项目,添加web、mybatis-plus、mysql相关依赖2.2 在项目中的application.yml 添加数据源2.3 创建定时器2.3.1 创建SysCron实体类2.3.2 创建CronMapper2.3.3 配置dao层包扫描2.3.4 配置定时任务2.4 启动项目,进行测试3.代码源码 在Spring Boot项目中,通过@EnableScheduling可启用Spring

12程序猿的博客 6415

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 272

Spring 中,定时任务接口 SchedulingConfigurer

Spring 中,创建定时任务除了使用@Scheduled 注解外,还可以使用 SchedulingConfigurer。 @Schedule 注解有一个缺点,其定时的时间不能动态的改变,而基于 SchedulingConfigurer 接口的方式可以做到。SchedulingConfigurer 接口可以实现在@Configuration 类上,同时不要忘了,还需要@EnableSchedul...

【欢迎关注公众号:冬瓜白】 6999

在 ABAP Cloud 里优雅地调用 HTTP 服务:新一代 HTTP Client 全面实践与落地指南

摘要: 随着ABAP Cloud时代的到来,HTTP通信在SAP系统集成中的角色日益重要。传统CL_HTTP_CLIENT存在维护成本高、边界模糊等问题,而新一代ABAP HTTP Client采用Destination驱动的调用方式,通过CL_HTTP_DESTINATION_PROVIDER支持四种创建方式(URL、通信安排、BTP Destination服务、SM59连接)。该模型将连接配置与业务逻辑分离,使URL、认证等参数可集中管理。典型调用流程包括:基于Destination创建Client,设

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

GEE:连续变化检测 CCDC 提取断点信息(干扰时间、干扰幅度、干扰次数)

本文将介绍在 Google Earth Engine (GEE) 平台上连续变化检测与分类(Continuous Change Detection and Classification, CCDC)提取扰动时间、干扰幅度、干扰次数信息,并下载到本地的代码。

养乐多的博客 1943

任务调度处理系列之 Spring源码分析-【SchedulingConfigurer实现原理】

可能的场景 在做业务平台的时候我们经常会遇到,某些跟时间打交道的需要修改状态,比如说在时间区间之前,属于未生效状态,区间之内属于有效期,区间之后,属于过期,或者需要每天 每周 每月,甚至是年为单位的做一些固定的操作。通过定时任务可以通过开启定时任务来完成这些需求。 我做合同管理模块,合同有未生效,已生效,已过期,三个状态,不可能每次用户登录的时候去判断这个状态,然后修改,这样做会在登录的逻辑里边耦合了合同业务逻辑,同时消耗了登录时间,不太可取。 还有一些需要报表统计类的批量处理任务,任务量大,类别也.

Coder_Boy_的博客 3416

android 蓝牙通讯demo

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

Spring 自定义任务调度配置SchedulingConfigurer

Spring的SchedulingConfigurer接口提供了动态任务调度的高级功能,包括自定义线程池配置、复杂触发逻辑和动态任务管理。相比于静态的@Scheduled注解,它更适合需要实时调整执行周期、高并发处理或分布式协调的场景。关键实现包括通过configureTasks方法注册任务,结合Trigger接口实现动态调度,并支持从配置中心热更新参数。使用时需注意线程池优化、异常处理和任务取消机制。该方案平衡了灵活性与复杂度,适用于电商促销、实时计算等需要灵活调整任务频率的业务场景。

Made In SQL 1352

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

springboot定时任务SchedulingConfigurer异步多线程实现

springboot +mybatisPlus 实现定时任务动态多线程异步执行。根据数据库配置动态增加、删除定时任务

wfreefish的博客 1585

【自定义定时任务的执行时间】

项目场景: 根据数据库配置的时间执行一次定时任务 问题描述: 使用SchedulingConfigurer类的configureTasks方法添加自定义执行时间的定时任务时,本来是可以在项目启动时自动执行的,但是项目启动报错 @Configuration public class ScheduledConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTask

qq_39974348的博客 2151

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor是Spring框架中用于任务调度和线程池管理的类。ThreadPoolTaskScheduler主要用于任务调度,按照时间间隔或Cron表达式执行任务。ThreadPoolTaskExecutor主要用于线程池管理,执行异步任务和多线程任务。

qq_41067796的博客 3180

SchedulingConfigurer接口不用重启服务 实现动态更改时间的定时任务(zk分布式锁定时任务)

实现SchedulingConfigurer接口,并且重写configureTasks方法。 package cn.tongdun.spartan.biz.support.impl; import cn.tongdun.spartan.biz.support.service.DockCustomerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factor

学习 记录 总结 分享 2185

【多线程编程】--任务调度类ThreadPoolTaskScheduler、ScheduledThreadPoolExecutor解析

springboot的常见的任务调度这篇文章介绍了一些常见的任务调度技术方法。接下来,将会对ThreadPoolTaskScheduler、ScheduledThreadPoolExecutor进行对比。通过简单使用、源码实现、优缺点等来分析,以便在各种应用场景上使用相应技术。下面介绍的技术主要是针对 非分布式环境下可以考虑采用。ScheduledThreadPoolExecutor适用场景:主要是延迟一次性任务、周期性任务;

寻梦友的博客 3125

定时器中ThreadPoolTaskScheduler的使用

文章目录前言一、为什么使用ThreadPoolTaskScheduler?二、使用步骤1.启动类2.编写定时任务配置类3.编写工具类实现定时任务的增删改查。 前言 最近业务上有个需求是将当天的直播进行录制,这里录制技术我们不做过多研究,主要使用的是ffmpeg,有兴趣的可以下来去研究研究。其中的录制要求有两点。一是能够在录制中进行更改录制时间,二是能够实现周期录制。个人对上述的要求在业务上采用了定时器来进行实现。主要使用的是ThreadPoolTaskScheduler。 一、为什么使用ThreadPo

weixin_43144460的博客 7094

使用ThreadPoolTaskScheduler实现可关闭的定时任务

按照执行时间启动指定时间间隔执行的定时任务,并在不需要时手动关闭。

weixin_49990593的博客 1974

ThreadPoolTaskScheduler自定义定时任务框架

之前用的@Sceduler定时框架,服务启动后就不能重新修改执行计划(或许有,我孤陋寡闻),后来换成这个,可以随时添加,删除,修改定时任务,配置修改发布,实时生效。

laolvbig的博客 2188
上一篇: GIT | 解决IDEA每次git拉取远程代码 default changelist 都会出现 .idea文件修改记录
下一篇: MySQL | join on、inner join、left join on和right join的区别及示例
鲨鱼辣椒不吃辣c
博客等级 码龄8年 1万+粉丝 93原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值