当前位置: 首页 > news >正文

【智能排班系统】快速消费线程池

文章目录

  • 线程池介绍
    • 线程池核心参数
      • 核心线程数(Core Pool Size)
      • 最大线程数(Maximum Pool Size)
      • 队列(Queue)
      • 线程空闲超时时间(KeepAliveTime)
      • 拒绝策略(RejectedExecutionHandler)
    • 线程池执行流程
  • 快速消费线程池
    • 快速消费线程池组件
      • 相关依赖
      • 快速消费队列
      • 快速消费线程池
      • 获取配置文件的配置
      • 配置线程池Bean到容器中
  • 说明

线程池介绍

线程池作为多线程编程中的重要工具,旨在通过复用已创建的线程来减少线程创建与销毁的开销,提升系统资源利用率和并发性能。要有效地使用线程池,理解和配置其核心参数至关重要。

线程池核心参数

创建一个线程池的代码如下,可以看到构造方法需要传递几个参数,下文会详细展示每个参数的含义:

// 导包
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;// 创建线程池
return new ThreadPoolExecutor(poolConfigProperties.getCoreSize(),poolConfigProperties.getMaxSize(),poolConfigProperties.getKeepAliveTime(),TimeUnit.SECONDS,//队列的最大容量new LinkedBlockingDeque<>(600),//使用默认的工程Executors.defaultThreadFactory(),//使用拒绝新来的拒绝策略new ThreadPoolExecutor.CallerRunsPolicy()
);

核心线程数(Core Pool Size)

核心线程数是指线程池在初始化时创建并保持活动状态的线程数量。即使这些线程当前没有任务执行,它们也不会被回收。核心线程数通常根据系统资源、预期并发负载和任务特性来设定。核心线程在池中长期存在,能够快速响应新提交的任务,减少任务提交后的等待时间。

最大线程数(Maximum Pool Size)

最大线程数限制了线程池能同时容纳的线程总数。当核心线程数无法满足当前任务需求时,线程池会创建额外的线程直至达到最大线程数。超过这个阈值后,线程池将采取拒绝策略处理新提交的任务。合理设置最大线程数,既能防止资源过度消耗导致系统过载,又能确保在高并发场景下有足够的线程处理任务。

队列(Queue)

线程池通常配合任务队列使用,用于暂存待处理的任务。当所有核心线程都处于忙碌状态且未达到最大线程数时,新提交的任务会被放入队列中等待。常见的队列类型包括无界队列(如 LinkedBlockingQueue)、有界队列(如 ArrayBlockingQueue)和优先级队列(如 PriorityBlockingQueue)。队列的选择和容量大小直接影响线程池的阻塞策略和任务调度效率。

线程空闲超时时间(KeepAliveTime)

当线程池中存在超出核心线程数的非核心线程,并且这些线程在一段时间内(即 KeepAliveTime)没有执行任何任务,则会自动终止。这个参数有助于释放闲置资源,避免资源浪费。对于长期存在大量任务的系统,可以适当增大或关闭这个超时时间。

拒绝策略(RejectedExecutionHandler)

当线程池和队列都无法接纳新任务时,需要采用拒绝策略来处理。常见的拒绝策略有:

  • AbortPolicy:默认策略,直接抛出 RejectedExecutionException。
  • CallerRunsPolicy:由提交任务的线程自行执行任务。
  • DiscardPolicy:默默地丢弃任务,不抛出异常也不执行。
  • DiscardOldestPolicy:丢弃队列中最旧的任务,尝试提交新任务。

在这里插入图片描述

线程池执行流程

  • 初始阶段线程池创建并启动核心线程数指定数量的线程。此时,如果有任务提交,直接由这些核心线程执行。

  • 核心线程饱和当所有核心线程都在执行任务且任务队列尚未满时,新提交的任务被放入队列等待

  • 队列满载:若任务提交速率持续高于线程处理速度,队列达到其容量上限。此时,线程池开始创建新的线程(不超过最大线程数),直接执行新提交的任务。

  • 达到最大线程数:若任务增长仍然无法遏制,线程池达到最大线程数。此时,新提交的任务将触发拒绝策略

  • 任务减少与线程收缩:当任务提交速率降低,线程池中的线程开始完成任务并变得空闲。对于非核心线程,若在 KeepAliveTime 时间内未获得新任务,将被终止。系统逐渐回归到更低的线程数,直至仅保留核心线程

在任务量增长的过程中,线程池通过动态调整线程数量和利用任务队列,既保证了系统的响应能力,又防止了资源过度消耗。

快速消费线程池

快速消费线程池通过对上述线程池进行改造,当核心线程饱和时,再提交的任务不是先加入到队列中,而是直接创建非核心线程来执行新提交任务。快速消费线程池可以加快任务的执行,减少任务的堆积。

快速消费线程池组件

在这里插入图片描述

相关依赖

<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>provided</scope></dependency>
</dependencies>

快速消费队列

该类继承自LinkedBlockingQueue,并对其offer方法进行定制,以配合EagerThreadPoolExecutor实现更灵活的任务调度策略。主要目的是在满足特定条件时,促使线程池创建非核心线程以快速处理任务,而非直接将任务放入队列等待处理。

import lombok.Data;import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;/*** 快速消费任务队列*/
@Data
public class EagerTaskQueue<R extends Runnable> extends LinkedBlockingQueue<Runnable> {private EagerThreadPoolExecutor executor;/*** 构造函数,传入队列容量参数,用于初始化LinkedBlockingQueue。** @param capacity 队列的最大容量*/public EagerTaskQueue(int capacity) {super(capacity);}/*** 重写父类LinkedBlockingQueue的offer方法,实现自定义的任务入队逻辑* 当没有到达最大线程时,返回false,让其创建非核心线程** @param runnable 待添加的任务对象* @return 如果任务成功加入队列或触发线程池创建非核心线程,则返回true;否则返回false*/@Overridepublic boolean offer(Runnable runnable) {// 获取当前线程池的线程数量int currentPoolThreadSize = executor.getPoolSize();// 检查是否有核心线程处于空闲状态(已提交任务数小于当前线程数)if (executor.getSubmittedTaskCount() < currentPoolThreadSize) {// 如果有核心线程正在空闲,将任务加入阻塞队列,由核心线程进行处理任务return super.offer(runnable);}// 检查当前线程池线程数量是否小于最大线程数if (currentPoolThreadSize < executor.getMaximumPoolSize()) {
//            System.out.println("线程池线程数量小于最大线程数,返回 False,线程池会创建非核心线程");// 当前线程池线程数量小于最大线程数,返回false,触发线程池创建非核心线程处理任务return false;}// 如果当前线程池数量大于最大线程数,任务加入阻塞队列,等待线程池中的已有线程处理return super.offer(runnable);}/**** @param runnable      待添加的任务对象* @param timeout       等待加入队列的超时时间* @param timeUnit      超时时间单位* @return              如果任务成功加入队列或触发线程池创建非核心线程,则返回true;否则返回false* @throws InterruptedException 如果在等待过程中线程被中断* @throws RejectedExecutionException 如果线程池已关闭*/public boolean retryOffer(Runnable runnable, long timeout, TimeUnit timeUnit) throws InterruptedException {// 如果线程池已关闭,则抛出RejectedExecutionException异常。if (executor.isShutdown()) {throw new RejectedExecutionException("Executor is shutdown!");}return super.offer(runnable, timeout, timeUnit);}
}

快速消费线程池

该类继承自ThreadPoolExecutor,并对其进行定制,以实现更灵活的任务调度策略。主要特点包括:

  • 使用自定义的EagerTaskQueue作为工作队列,支持根据线程池状态动态调整任务入队逻辑。
  • 维护正在处理的任务数量计数器(submittedTaskCount),以便EagerTaskQueue判断是否有核心线程处于空闲状态。
  • 在execute方法中,处理任务提交失败的情况,尝试将任务重新投递到队列或使用拒绝策略。
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;/*** 快速消费线程池*/
public class EagerThreadPoolExecutor extends ThreadPoolExecutor {/*** 使用AtomicInteger记录当前正在处理的任务数量,提供线程安全的计数操作。*/private final AtomicInteger submittedTaskCount = new AtomicInteger(0);/*** 构造函数,接受线程池相关的配置参数,包括核心线程数、最大线程数、线程存活时间、时间单位、工作队列、线程工厂和拒绝策略。* 工作队列类型为自定义的EagerTaskQueue,用于实现特殊的任务入队逻辑。** @param corePoolSize         核心线程数* @param maximumPoolSize      最大线程数* @param keepAliveTime        线程空闲后的存活时间* @param unit                 时间单位* @param workQueue            工作队列,类型为EagerTaskQueue* @param threadFactory        线程工厂,用于创建新线程* @param handler              拒绝策略,当线程池和队列无法接受新任务时的处理方式*/public  EagerThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,EagerTaskQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);}/*** 创建一个EagerThreadPoolExecutor实例的便捷方法* 包括创建EagerTaskQueue并设置其与线程池的关联** @param corePoolSize         核心线程数* @param maximumPoolSize      最大线程数* @param keepAliveTime        线程空闲后的存活时间* @param unit                 时间单位* @param queueCapacity        队列容量* @param threadFactory        线程工厂,用于创建新线程* @param handler              拒绝策略,当线程池和队列无法接受新任务时的处理方式* @return                     创建的EagerThreadPoolExecutor实例*/public static EagerThreadPoolExecutor createEagerThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,int queueCapacity,ThreadFactory threadFactory,RejectedExecutionHandler handler) {EagerTaskQueue eagerTaskQueue = new EagerTaskQueue(queueCapacity);EagerThreadPoolExecutor eagerThreadPoolExecutor = new EagerThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, eagerTaskQueue, threadFactory, handler);eagerTaskQueue.setExecutor(eagerThreadPoolExecutor);return eagerThreadPoolExecutor;}/*** 获取当前正在处理的任务数量。** @return 当前正在处理的任务数量*/public int getSubmittedTaskCount() {return submittedTaskCount.get();}/*** 重写父类的afterExecute方法,当任务执行完成后,将正在执行的任务数量减一。* 这是ThreadPoolExecutor提供的钩子方法,用于在任务执行结束后进行清理或其他操作。** @param r       执行完毕的任务* @param t       执行过程中抛出的异常(如果有的话)*/@Overrideprotected void afterExecute(Runnable r, Throwable t) {// 任务执行完成,将正在执行数量-1submittedTaskCount.decrementAndGet();}/*** 重写父类的execute方法,用于提交任务到线程池。* 在提交任务之前,先将正在执行的任务数量加一。若提交失败,根据具体情况尝试重新投递任务或使用拒绝策略。** @param command 待提交的任务* @throws RejectedExecutionException 如果任务无法被接受,且无法重新投递到队列*/@Overridepublic void execute(Runnable command) {
//        System.out.println("使用快速消费线程池执行任务");// 将正在执行任务数量 + 1submittedTaskCount.incrementAndGet();try {super.execute(command);} catch (RejectedExecutionException ex) {// 任务被拒绝,间隔一定时间,将任务重新投递到队列EagerTaskQueue eagerTaskQueue = (EagerTaskQueue) super.getQueue();try {// 将任务重新投递到队列if (!eagerTaskQueue.retryOffer(command, 10, TimeUnit.MILLISECONDS)) {// 队列已满,使用拒绝策略,并减少计数submittedTaskCount.decrementAndGet();throw new RejectedExecutionException("Queue capacity is full.", ex);}} catch (InterruptedException iex) {// 重试失败,将正在执行任务数量 - 1submittedTaskCount.decrementAndGet();throw new RejectedExecutionException(iex);}} catch (Exception ex) {// 执行失败,将正在执行任务数量 - 1submittedTaskCount.decrementAndGet();throw ex;}}
}

获取配置文件的配置

在这里插入图片描述

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "sss.thread")
@Component//将该配置放到容器中
@Data
public class ThreadPoolConfigProperties {private Integer coreSize;private Integer maxSize;private Integer keepAliveTime;}

配置线程池Bean到容器中

import com.dam.eager.EagerThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;@Configuration
public class MyThreadConfig {/*** @param poolConfigProperties 如果需要使用到ThreadPoolConfigProperties,一定要使用Component将其加入到容器中* @return*/@Beanpublic ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties poolConfigProperties) {// 普通线程池
//        return new ThreadPoolExecutor(poolConfigProperties.getCoreSize(),
//                poolConfigProperties.getMaxSize(),
//                poolConfigProperties.getKeepAliveTime(),
//                TimeUnit.SECONDS,
//                //队列的最大容量
//                new LinkedBlockingDeque<>(600),
//                //使用默认的工程
//                Executors.defaultThreadFactory(),
//                //使用拒绝新来的拒绝策略
//                new ThreadPoolExecutor.CallerRunsPolicy()
//        );// 快速消费线程池return EagerThreadPoolExecutor.createEagerThreadPoolExecutor(poolConfigProperties.getCoreSize(),poolConfigProperties.getMaxSize(),poolConfigProperties.getKeepAliveTime(),TimeUnit.SECONDS,// 队列的最大容量600,// 使用默认的工程Executors.defaultThreadFactory(),// 使用拒绝新来的拒绝策略new ThreadPoolExecutor.CallerRunsPolicy());}
}

说明

快速线程池的实现参考马哥 12306 的代码,代码仓库为12306,该项目含金量较高,有兴趣的同学可以去学习一下。

相关文章:

【智能排班系统】快速消费线程池

文章目录 线程池介绍线程池核心参数核心线程数&#xff08;Core Pool Size&#xff09;最大线程数&#xff08;Maximum Pool Size&#xff09;队列&#xff08;Queue&#xff09;线程空闲超时时间&#xff08;KeepAliveTime&#xff09;拒绝策略&#xff08;RejectedExecutionH…...

C语言——内存函数

前言&#xff1a; C语言中除了字符串函数和字符函数外&#xff0c;还有一些函数可以直接对内存进行操作&#xff0c;这些函数被称为内存函数&#xff0c;这些函数与字符串函数都属于<string.h>这个头文件中。 一.memcpy&#xff08;&#xff09;函数 memcpy是C语言中的…...

ideaSSM图书借阅管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 图书借阅管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主…...

普联一面4.2面试记录

普联一面4.2面试记录 文章目录 普联一面4.2面试记录1.jdk和jre的区别2.java的容器有哪些3.list set map的区别4.get和post的区别5.哪个更安全6.java哪些集合类是线程安全的7.创建线程有哪几种方式8.线程的状态有哪几种9.线程的run和start的区别10.什么是java序列化11.redis的优…...

SQLite的架构(十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite下一代查询规划器(十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 介绍 本文档介绍SQLite库的架构。 这里的信息对那些想要了解或 修改SQLite的内部工作原理。 接口SQL 命令处理器虚拟机B-树…...

Vue2电商前台项目(一):项目前的初始化及搭建

一、项目初始化 创建项目&#xff1a;sudo vue create app 1.项目配置 &#xff08;1&#xff09;浏览器自动打开 在package.json文件中&#xff0c;serve后面加上 --open "scripts": {"serve": "vue-cli-service serve --open","buil…...

4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令

4.6 offset指令&#xff0c;jmp short指令&#xff0c;far&#xff0c;dword ptr各种跳转指令 可以修改IP&#xff0c;或同时修改CS和IP的指令统称为转移指令。概括的讲&#xff0c;转移指令就是可以控制CPU执行内存中某处代码的指令 1. 转移指令 1.1 8086CPU的转移行为有以…...

【WEEK5】 【DAY5】DML语言【中文版】

2024.3.29 Friday 目录 3.DML语言3.1.外键&#xff08;了解&#xff09;3.1.1.概念3.1.2.作用3.1.3.添加&#xff08;书写&#xff09;外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写&#xff08;被引用的表的被引用的部分&#xff09;3.1.3.2.先创建表后修改表以添加…...

媒体偏见从何而来?--- 美国MRC(媒体评级委员会)为何而生?

每天当我们打开淘宝&#xff0c;京东&#xff0c;步入超市&#xff0c;逛街或者逛展会&#xff0c;各种广告铺天盖地而来。从原来的平面广告&#xff0c;到多媒体广告&#xff0c;到今天融合AR和VR技术的数字广告&#xff0c;还有元宇宙虚拟世界&#xff0c;还有大模型加持的智…...

Solana 线下活动回顾|多方创新实践,引领 Solana“文艺复兴”新浪潮

Solana 作为在过去一年里实现突破式飞跃的头部公链&#xff0c;究竟是如何与 Web3 行业共振&#xff0c;带来全新的技术发展与生态亮点的呢&#xff1f;在 3 月 24 日刚结束的「TinTin Destination Moon」活动现场&#xff0c;来自 Solana 生态的的专家大咖和 Web3 行业的资深人…...

CSS3 实现文本与图片横向无限滚动动画

文章目录 1. 实现效果2.html结构3. css代码 1. 实现效果 gif录屏比较卡&#xff0c;实际很湿滑&#xff0c;因为是css动画实现的 2.html结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…...

Android 性能优化之黑科技开道(一)

1. 缘起 在开发电视版智家 App9.0 项目的时候&#xff0c;发现了一个性能问题。电视系统原本剩余的可用资源就少&#xff0c;而随着 9.0 功能的进一步增多&#xff0c;特别是门铃、门锁、多路视频同屏监控后等功能的增加&#xff0c;开始出现了卡顿情况。 经过调研分析发现有…...

Successive Convex Approximation算法的学习笔记

文章目录 一、代码debug二、原理 本文主要参考了CSDN上的 另一篇文章&#xff0c;但规范了公式的推导过程和修缮了部分代码 一、代码debug 首先&#xff0c;我们将所有的代码放到MATLAB中&#xff0c;很快在命令行中出现了错误信息 很显然有问题&#xff0c;但是我不知道发生…...

IoT数采平台2:文档

IoT数采平台1&#xff1a;开篇IoT数采平台2&#xff1a;文档IoT数采平台3&#xff1a;功能IoT数采平台4&#xff1a;测试 【平台功能】 基础配置、 实时监控、 规则引擎、 告警列表、 系统配置 消息通知&#xff1a;Websocket 设备上线、设备下线、 数据变化、 告警信息、 实时…...

Vue监听器watch的基本用法

文章目录 1. 作用2. 格式3. 示例3.1 value 值为字符串3.2 value 值为函数3.3 value 值为对象 4. 与计算属性对比 1. 作用 监视数据变化&#xff0c;执行一些业务逻辑或异步操作。 2. 格式 监听器 watch 内部以 key &#xff1a;value 的形式定义&#xff0c;key 是 data 中的…...

MySQL UPDATE JOIN 根据一张表或多表来更新另一张表的数据

当使用MySQL时&#xff0c;经常需要根据一张表或多张表的数据来更新另一张表的数据。这种情况下&#xff0c;我们可以使用UPDATE语句结合JOIN操作来实现这一需求。本文将介绍MySQL中使用UPDATE JOIN的技术。 什么是UPDATE JOIN UPDATE JOIN是MySQL中一种结合UPDATE语句和JOIN…...

JS实现继承的方式ES6版

上一篇&#xff1a;JS实现继承的方式原生版 ES6的继承 主要是依赖extends关键字来实现继承&#xff0c;且继承的效果类似于寄生组合继承。 class Parent() { }class Child extends Parent {constructor(x, y, color) {super(x, y);this.color color;} }子类必须在construct…...

elementui 左侧或水平导航菜单栏与main区域联动

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…...

YUNBEE云贝-技术分享:PostgreSQL分区表

引言 PostgreSQL作为一款高度可扩展的企业级关系型数据库管理系统&#xff0c;其内置的分区表功能在处理大规模数据场景中扮演着重要角色。本文将深入探讨PostgreSQL分区表的实现逻辑、详细实验过程&#xff0c;并辅以分区表相关的视图查询、分区表维护及优化案例&#xff0c;…...

5.2 通用代码,数组求和,拷贝数组,si配合di翻转数组

5.2 通用代码&#xff0c;数组求和&#xff0c;拷贝数组&#xff0c;si配合di翻转数组 1. 通用代码 通用代码类似于一个用汇编语言写程序的一个框架&#xff0c;也类似于c语言的头文件编写 assume cs:code,ds:data,ss:stack data segmentdata endsstack segmentstack endsco…...

Oracle23免费版简易安装攻略

installation-guide 1 安装 root用户下 wget https://yum.oracle.com/repo/OracleLinux/OL8/developer/x86_64/getPackage/oracle-database-preinstall-23c-1.0-1.el8.x86_64.rpm wget https://download.oracle.com/otn-pub/otn_software/db-free/oracle-database-free-23c-1…...

《论文阅读》一种基于反事实推理的会话情绪检测无训练去偏框架 EMNLP 2023

《论文阅读》一种基于反事实推理的会话情绪检测无训练去偏框架 EMNLP 2023 前言简介相关工作模型构架Basic ClassificationBias ExtractionUnbiased Inference实验结果前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天…...

基于springboot+vue的健身房管理预约管理系统

...

【编译lombok问题】已解决:编译突然找不到符号问题-get/set找不到符号

一、场景&#xff1a;编译突然找不到符号 报错信息&#xff1a; 找不到符号 符号&#xff1a;方法getName() 二、原因&#xff1a; 没有使用lombok支持的编译器 三、解决方法&#xff1a; 打开File-Settings&#xff0c;按以下步骤进行设置&#xff1b; 修改&#xff1a;-Djp…...

第四篇:3.3 无效流量(Invalid traffic) - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability&#xff09;第四篇广…...

PyTorch示例——使用Transformer写古诗

文章目录 PyTorch示例——使用Transformer写古诗1. 前言2. 版本信息3. 导包4. 数据与预处理数据下载先看一下原始数据开始处理数据&#xff0c;过滤掉异常数据定义 词典编码器 Tokenizer定义数据集类 MyDataset测试一下MyDataset、Tokenizer、DataLoader 5. 构建模型位置编码器…...

vue 视频添加水印

1.需求背景 其实腾讯云点播的api也支持视频水印&#xff0c;但是只有单个水印&#xff0c;大概效果是这样子的&#xff0c;不满足我们的需求&#xff0c;我们的需求是需要视频中都是水印。 腾讯云点播水印 项目需求的水印&#xff08;主要是防录屏,最后的实现效果是这样&…...

Web Animations API 动画

Element.animate() dom.animate动画可以避免污染dom原有的css动画 参考资料 Element.animate() - Web API 接口参考 | MDN Element: getAnimations() method - Web APIs | MDN .tunnel{width:200px;height:200px;background-color:#38f;}<div class"tunnel" …...

【大数据存储】实验五:Mapreduce

实验Mapreduce实例——排序&#xff08;补充程序&#xff09; 实验环境 Linux Ubuntu 16.04 jdk-8u191-linux-x64 hadoop-3.0.0 hadoop-eclipse-plugin-2.7.3.jar eclipse-java-juno-SR2-linux-gtk-x86_64 实验内容 在电商网站上&#xff0c;当我们进入某电商页面里浏览…...

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…...

哈尔滨网站建设oeminc/关键词首页排名优化

我的首发平台是公众号【CodeAllen】&#xff0c;学习交流QQ群&#xff1a;736386324,转载请注明出处 我的观点是肯定可以 虽然汽车和手机外形差别巨大&#xff0c;大多数人都不会认为他们俩是一种东西&#xff0c;但是之后新能源时代汽车的发展路径肯定是个手机一模一样的 那…...

竞网做的网站怎么样/充电宝关键词优化

子选择器 引用链接&#xff1a;http://blog.csdn.net/u012110719/article/details/41171517 还有一个比较有用的选择器子选择器&#xff0c;即大于符号(>),用于选择指定标签元素的第一代子元素。如右侧代码编辑器中的代码&#xff1a; .food>li{border:1px solid red;} 这…...

网站建设的素材/seo网站关键词排名优化公司

我思考了一下上一个程序为什么会失败&#xff0c;可能还是太远了&#xff0c;所以这次弄近一点。把5000米改成1000米吧。。。其他的还是不变 function的持续不变&#xff0c;在这里就不重复写了&#xff0c;具体参照上一篇博客 主函数&#xff1a;关于亮点1 % clc;close all;cl…...

重庆网站制作武汉/权重查询

数据库操作现在我们创建了模型&#xff0c;生成了数据库和表&#xff0c;下面来学习常用的数据库操作&#xff0c;数据库操作主要是CRUD&#xff0c;即Create(创建)、Read(读取/查询)、Update(更新)和Delete(删除)。SQLAlchemy使用数据库会话来管理数据库操作&#xff0c;这里的…...

lol做视频那个网站好/百度投诉热线中心客服

时间函数select curdate(); 返回2014-09-12,不包含时分秒select curtime(); 返回14:13:22&#xff0c;不包含年月日select now(); 返回2014-09-12 10:46:17select unix_timestamp(now());unix_timestamp(date)返回date的UNIX时间戳 select unix_timestamp(2013-09-01)…...

网站建设的一般过程包括哪些方面/自媒体账号申请

88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 就是归并排序的merge嘛&#xff0c;借助一个辅助数组就可以了。 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {if(n 0) return;vector&l…...