springboot第74集:设计模式
解析
核心线程数与CPU核数相同:避免线程过多导致的上下文切换,提高CPU利用率。
无界队列:适合任务量大且任务执行时间短的场景,避免因队列满而拒绝任务。
IO密集型任务
场景描述
适用于执行大量IO操作的任务,如文件读写、网络通信、数据库访问等。这类任务在等待IO时线程处于阻塞状态,因此可以通过增加线程数来提高并发度。
线程池配置
核心线程数:根据CPU核数和IO等待时间来调整,通常设置为CPU核数的2倍或更多。
最大线程数:可以设置为更高,取决于系统资源和任务特性。
任务队列:使用有界队列(如
LinkedBlockingQueue
),防止过多线程导致资源耗尽。java
import java.util.concurrent.*;public class IOBoundExample {public static void main(String[] args) {int cpuCores = Runtime.getRuntime().availableProcessors();int corePoolSize = cpuCores * 2;int maxPoolSize = cpuCores * 4;long keepAliveTime = 60L;ExecutorService executor = new ThreadPoolExecutor(corePoolSize,maxPoolSize,keepAliveTime, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(1000), // 有界队列new ThreadPoolExecutor.CallerRunsPolicy() // 饱和策略);for (int i = 0; i < 1000; i++) {executor.submit(() -> {// IO密集型任务,例如数据库查询performDatabaseQuery();});}executor.shutdown();}private static void performDatabaseQuery() {// 模拟IO操作System.out.println("Performing DB query by " + Thread.currentThread().getName());try {Thread.sleep(100); // 模拟IO延迟} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}
长时间运行的任务
场景描述
适用于需要长时间处理的任务,如视频处理、数据分析、复杂计算等。这类任务占用线程时间较长,可能导致线程池中的线程被长期占用。
线程池配置
核心线程数:适中,不宜过多,以防止系统资源被长时间占用。
最大线程数:可以适当增加,但需要考虑系统资源限制。
任务队列:使用有界队列,并合理设置队列大小,防止大量长时间任务导致线程池资源耗尽。
import java.util.concurrent.*;public class LongRunningTaskExample {public static void main(String[] args) {int corePoolSize = 4;int maxPoolSize = 8;long keepAliveTime = 120L;ExecutorService executor = new ThreadPoolExecutor(corePoolSize,maxPoolSize,keepAliveTime, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(100), // 有界队列new ThreadPoolExecutor.AbortPolicy() // 饱和策略:拒绝任务);for (int i = 0; i < 50; i++) {executor.submit(() -> {// 长时间任务,例如视频处理processVideo();});}executor.shutdown();}private static void processVideo() {// 模拟长时间处理System.out.println("Processing video by " + Thread.currentThread().getName());try {Thread.sleep(5000); // 模拟长时间任务} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}
网络IO密集:RPC调用通常涉及较多的网络IO,因此线程会存在等待IO的情况。
批量任务拆分:批量操作通常会将大量任务分发到多个节点或服务进行处理,确保每个节点的负载均衡尤为关键。
并发限制:为了避免对单个节点或服务的过度压力,线程池的大小和任务队列的处理策略必须合理控制。
产生进程的情况
服务启动:后端服务启动时,通常会通过操作系统创建一个或多个进程来运行服务。
任务分发:某些服务可能为了处理不同的任务,创建多个子进程来分担负载。例如,处理批量数据、并行计算等。
异步处理:当需要异步处理任务,或处理一些耗时较长的任务时,可以通过创建新的进程来避免阻塞主进程。
多进程架构:一些后端框架(如Django、Flask等)或部署工具(如Gunicorn、uWSGI等)会自动创建多个进程来处理多用户并发请求。
线程池是一种管理多个线程执行的机制,通过复用一组线程来避免频繁创建和销毁线程,节省系统资源。大部分编程语言和框架都会有内置的线程池机制。
在Java中,常用的线程池框架是java.util.concurrent
包下的ExecutorService
。创建和控制线程池通常涉及以下几个方面:
线程池的创建:
ExecutorService executorService = Executors.newFixedThreadPool(10); // 创建一个固定大小的线程池
FixedThreadPool:固定大小的线程池,适合处理稳定数量的任务。
CachedThreadPool:根据需求动态创建线程池,适合任务负载波动较大的场景。
ScheduledThreadPool:用于调度任务的线程池,支持周期性或延迟执行任务。
SingleThreadExecutor:只有一个线程的线程池,适合顺序执行任务。
线程池的控制:
执行任务:通过
submit()
方法提交任务到线程池。
executorService.submit(() -> {// 任务逻辑
});
关闭线程池:当不再需要使用线程池时,应该调用shutdown()
方法关闭它。
executorService.shutdown();
调用shutdown()
后,线程池不再接受新任务,但会继续执行已提交的任务。可以使用awaitTermination()
方法等待所有任务执行完成。
线程池的参数设置:
核心线程数(Core Pool Size) :线程池中保持活动线程数的最小值。
最大线程数(Maximum Pool Size) :线程池能够容纳的最大线程数量。
线程存活时间(Keep Alive Time) :当线程池中的线程数量超过核心线程数时,多余的空闲线程存活的时间。
任务队列(Task Queue) :当所有线程都在忙时,新的任务会被放入任务队列等待执行。
在创建线程池时可以指定这些参数:
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心线程数4, // 最大线程数60, // 线程空闲存活时间TimeUnit.SECONDS, // 存活时间的单位new LinkedBlockingQueue<Runnable>() // 任务队列
);
控制和调整线程池的参数
根据系统负载和任务类型的不同,选择合适的线程池大小和配置非常重要:
小任务并发:如果任务非常小且耗时短,建议使用较大的线程池和较小的任务队列。
长时间任务:如果任务执行时间较长,建议保持较小的线程池,避免线程上下文切换带来的开销。
队列的选择:常用的任务队列有
LinkedBlockingQueue
(无界队列)和SynchronousQueue
(直接提交队列)。
总结:
进程通常在服务启动、异步任务或多进程架构中产生。
线程池通过Executor框架创建,常见参数有核心线程数、最大线程数、存活时间和任务队列。
根据任务类型和系统负载选择合适的线程池配置,避免资源浪费或阻塞。
工厂方法模式,抽象工厂模式
模拟单机服务 RedisUtils
public class RedisUtils {private Logger logger = LoggerFactory.getLogger(RedisUtils.class);private Map<String, String> dataMap = new ConcurrentHashMap<>();public String get(String key) {logger.info("Redis获取数据 key: {}", key);return dataMap.get(key);}public String set(String key, String value) {logger.info("Redis写入数据 key:{} val:{}", key, value);dataMap.put(key, value);}public void set(String key, String value, long timeout, TimeUnit timeUNit) {logger.info("Redis写入数据 key:{} val:{} timeout: {} timeUnit: {}", key, value, timeout, timeUnit.toString());dataMap.put(key, value);}public void del(String key) {logger.info("Redis删除数据 key:{}", key);dataMap.remove(key);}
}
模拟集群 EGM
模拟集群 IIR
public interface CacheService {String get(final String key);void set(String key, String value);void set(String key, String value, long timeout, TimeUnit timeUnit);void del(String key);}
public class CacheServiceImpl implements CacheService {private RedisUtils redisUtils = new RedisUtils();public String get(String key) {return redisUtils.get(key);}public void set(String key, String value) {redisUtils.set(key, value);}
public void set(String key, String value, long timeout, TimeUnittimeUnit) {redisUtils.set(key, value, timeout, timeUnit);}public void del(String key) {redisUtils.del(key);}}
抽象⼯⼚模型结构
public interface ICacheAdapter {String get(String key);void set(String key, String value);void set(String key, String value, long timeout, TimeUnit timeUnit);void del(String key);}
单⼀职责、开闭原则、解耦等优点
建造者模式
架构选型 、 功能设计 、 设计评审 、
代码实现 、 代码评审 、 单测覆盖率检查 、 编写⽂档 、 提交测试 。
原型模式介绍
public class ChoiceQuestion {private String name; // 题⽬private Map<String, String> option; // 选项;A、B、C、Dprivate String key; // 答案;Bpublic ChoiceQuestion() {}public ChoiceQuestion(String name, Map<String, String> option, Stringkey) {this.name = name;this.option = option;this.key = key;}// ...get/set}
public class AnswerQuestion {private String name; // 问题private String key; // 答案public AnswerQuestion() {}public AnswerQuestion(String name, String key) {this.name = name;this.key = key;}// ...get/set}
原型模式主要解决的问题就是创建⼤量᯿复的类,⽽我们模拟的场景就需要给不同的⽤户都创建相同的
试卷,但这些试卷的题⽬不便于每次都从库中获取,甚⾄有时候需要从远程的RPC中获取。这样都是⾮
常耗时的,⽽且随着创建对象的增多将严᯿影响效率。
在原型模式中所需要的⾮常᯿要的⼿段就是克隆,在需要⽤到克隆的类中都需要实现 implements
Cloneable 接⼝。
懒汉模式(线程不安全)
public class Singleton_01 {private static Singleton_01 instance;private Singleton_01() {}public static Singleton_01 getInstance(){if (null != instance) return instance;instance = new Singleton_01();return instance;}}
单例模式有⼀个特点就是不允许外部直接创建,也就是 new Singleton_01() ,因此这⾥在默认
的构造函数上添加了私有属性 private 。
⽬前此种⽅式的单例确实满⾜了懒加载,但是如果有多个访问者同时去获取对象实例你可以想象成
⼀堆⼈在抢厕所,就会造成多个同样的实例并存,从⽽没有达到单例的要求。
懒汉模式(线程安全)
public class Singleton_02 {private static Singleton_02 instance;private Singleton_02() {}public static synchronized Singleton_02 getInstance(){if (null != instance) return instance;instance = new Singleton_02();return instance;}}
此种模式虽然是安全的,但由于把锁加到⽅法上后,所有的访问都因需要锁占⽤导致资源的浪费。
如果不是特殊情况下,不建议此种⽅式实现单例模式。
饿汉模式(线程安全)
public class Singleton_03 {private static Singleton_03 instance = new Singleton_03();private Singleton_03() {}public static Singleton_03 getInstance() {return instance;}}
此种⽅式与我们开头的第⼀个实例化 Map 基本⼀致,在程序启动的时候直接运⾏加载,后续有外
部需要使⽤的时候获取即可。
但此种⽅式并不是懒加载,也就是说⽆论你程序中是否⽤到这样的类都会在程序启动之初进⾏创
建。
那么这种⽅式导致的问题就像你下载个游戏软件,可能你游戏地图还没有打开呢,但是程序已经将
这些地图全部实例化。到你⼿机上最明显体验就⼀开游戏内存满了,⼿机卡了,需要换了。
使⽤类的内部类(线程安全)
public class Singleton_04 {private static class SingletonHolder {private static Singleton_04 instance = new Singleton_04();}private Singleton_04() {}public static Singleton_04 getInstance() {return SingletonHolder.instance;}}
使⽤类的内部类(线程安全)
public class Singleton_04 {private static class SingletonHolder {private static Singleton_04 instance = new Singleton_04();}private Singleton_04() {}public static Singleton_04 getInstance() {return SingletonHolder.instance;}}
使⽤类的静态内部类实现的单例模式,既保证了线程安全有保证了懒加载,同时不会因为加锁的⽅
式耗费性能。
这主要是因为JVM虚拟机可以保证多线程并发访问的正确性,也就是⼀个类的构造⽅法在多线程环境下可以被正确的加载。
双重锁校验(线程安全)
public class Singleton_05 {private static Singleton_05 instance;private Singleton_05() {}public static Singleton_05 getInstance(){if(null != instance) return instance;synchronized (Singleton_05.class){if (null == instance){instance = new Singleton_05();}}return instance;}}
双重锁的⽅式是⽅法级锁的优化,减少了部分获取实例的耗时
CAS「AtomicReference」(线程安全)
java并发库提供了很多原⼦类来⽀持并发访问的数据安全
性; AtomicInteger 、 AtomicBoolean 、 AtomicLong 、 AtomicReference 。
AtomicReference 可以封装引⽤⼀个V实例,⽀持并发访问如上的单例⽅式就是使⽤了这样的⼀个
特点。
使⽤CAS的好处就是不需要使⽤传统的加锁⽅式保证线程安全,⽽是依赖于CAS的忙等算法,依赖
于底层硬件的实现,来保证线程安全。相对于其他锁的实现没有线程的切换和阻塞也就没有了额外
的开销,并且可以⽀持较⼤的并发性。
当然CAS也有⼀个缺点就是忙等,如果⼀直没有获取到将会处于死循环中。
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理,这7类。
⼀个框架随着时间的发展,它的复杂程度是越来越⾼的
适配器模式的主要作⽤就是把原本不兼容的接⼝,通过适配修改做到统⼀。
⽽这时候就会需要做⼀些营销系统,⼤部分常⻅的都是裂变、拉客,例如;你邀请⼀个⽤户开户、或者
邀请⼀个⽤户下单,那么平台就会给你返利,多邀多得。同时随着拉新的量越来越多开始设置每⽉下单
都会给⾸单奖励,等等,各种营销场景。
查询⽤户内部下单数量接⼝
public class OrderService {private Logger logger =LoggerFactory.getLogger(POPOrderService.class);public long queryUserOrderCount(String userId){logger.info("⾃营商家,查询⽤户的订单是否为⾸单:{}", userId);return 10L;}}
查询⽤户第三⽅下单⾸单接⼝
public class POPOrderService {private Logger logger =LoggerFactory.getLogger(POPOrderService.class);public boolean isFirstOrder(String uId) {logger.info("POP商家,查询⽤户的订单是否为⾸单:{}", uId);return true;}}
统⼀的MQ消息体
public class RebateInfo {private String userId; // ⽤户IDprivate String bizId; // 业务IDprivate Date bizTime; // 业务时间private String desc; // 业务描述// ... get/set}
桥接模式
public class PayController {private Logger logger = LoggerFactory.getLogger(PayController.class);public boolean doPay(String uId, String tradeId, BigDecimal amount,int channelType, int modeType) {// 微信⽀付if (1 == channelType) {logger.info("模拟微信渠道⽀付划账开始。uId:{} tradeId:{} amount:{}", uId, tradeId, amount);if (1 == modeType) {logger.info("密码⽀付,⻛控校验环境安全");} else if (2 == modeType) {logger.info("⼈脸⽀付,⻛控校验脸部识别");} else if (3 == modeType) {logger.info("指纹⽀付,⻛控校验指纹信息");
}}// ⽀付宝⽀付else if (2 == channelType) {logger.info("模拟⽀付宝渠道⽀付划账开始。uId:{} tradeId:{}amount:{}", uId, tradeId, amount);if (1 == modeType) {logger.info("密码⽀付,⻛控校验环境安全");} else if (2 == modeType) {logger.info("⼈脸⽀付,⻛控校验脸部识别");} else if (3 == modeType) {logger.info("指纹⽀付,⻛控校验指纹信息");}}return true;}}
1. 高并发、短时间任务
场景描述
适用于处理大量独立且执行时间较短的任务,例如Web请求处理、快速计算等。这类任务通常是CPU密集型的,执行时间短,且数量庞大。
线程池配置
核心线程数:与CPU核心数相同,避免过度创建线程导致上下文切换开销。
最大线程数:一般设置为与核心线程数相同或略高。
任务队列:使用无界队列(如
LinkedBlockingQueue
),避免因为任务量大而频繁创建和销毁线程。
import java.util.concurrent.*;public class HighConcurrencyExample {public static void main(String[] args) {int cpuCores = Runtime.getRuntime().availableProcessors();ExecutorService executor = new ThreadPoolExecutor(cpuCores, // 核心线程数cpuCores, // 最大线程数0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>() // 无界队列);for (int i = 0; i < 1000; i++) {executor.submit(() -> {// 短时间任务,例如处理一个请求processRequest();});}executor.shutdown();}private static void processRequest() {// 模拟处理请求System.out.println("Processing request by " + Thread.currentThread().getName());}
}
Tomcat 默认使用的线程池参数如下:
最大线程数 (
maxThreads
) : 200最小空闲线程数 (
minSpareThreads
) : 10最大排队请求 (
acceptCount
) : 100线程等待超时 (
connectionTimeout
) : 20000 毫秒(20 秒)
不过,如果你希望为所有连接器使用共享的线程池,可以在 server.xml
中配置一个全局的 Executor
,如下:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/>
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"executor="tomcatThreadPool" />
加群联系作者vx:xiaoda0423
仓库地址:github.com/webVueBlog/…
相关文章:
springboot第74集:设计模式
解析 核心线程数与CPU核数相同:避免线程过多导致的上下文切换,提高CPU利用率。无界队列:适合任务量大且任务执行时间短的场景,避免因队列满而拒绝任务。 IO密集型任务 场景描述 适用于执行大量IO操作的任务,如文件读写…...
数字化采购管理革新:全过程数字化采购管理平台的架构与实施
摘要:在数字化转型的浪潮中,采购管理正逐步迈向全流程的数字化。本文将详细解析全过程数字化采购管理平台的技术架构和实施策略,探讨如何通过Spring Cloud、Spring Boot2、Mybatis等先进技术和服务框架,实现从供应商管理到采购招投…...
Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新
文章目录 前言包准备CDN 集成代码分包Tree Shaking原理实现条件:解决 treeShaking 无效方案:示例代码: 热更新(HMR) 前言 Webpack 作为现代前端开发中的核心构建工具,提供了丰富的特性来帮助开发者优化和打…...
Robot Operating System——一组三维空间中的位姿(位置和方向)
大纲 应用场景1. 机器人导航场景描述具体应用 2. 运动规划场景描述具体应用 3. 物体识别和跟踪场景描述具体应用 4. 环境建模场景描述具体应用 5. 仿真环境场景描述具体应用 定义字段解释 案例 geometry_msgs::msg::PoseArray 是 ROS 2 中的一个消息类型,用于表示一…...
mycat读写分离中间件
5、部署Mycat读写分离中间件服务 5.1安装Mycat服务 将Mycat服务的二进制软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/root目录下,并将软件包解压到/use/local目录中 5.2赋予解压后的mycat目录权限 5.3向/etc/profile系统变量…...
Growthly Quest 增长工具:助力 Web3 项目实现数据驱动的增长
作者:Stella L (stellafootprint.network) 在瞬息万变的 Web3 领域,众多项目在用户吸引、参与和留存方面遭遇重重难关。Footprint Analytics 推出 Growthly,作为应对这些挑战的全方位解决方案,其中创新性的 Quest(任务…...
Pytorch 学习手册
零 相关资料 官方网址 官方网址下的API搜索网站 一 定义 深度学习框架是用于设计、训练和部署深度学习模型的软件工具包。这些框架提供了一系列预定义的组件,如神经网络层(卷积层、全连接层等)、损失函数、优化器以及数据处理工具…...
第十一章 【前端】调用接口(11.1)——Vite 环境变量
第十一章 【前端】调用接口 11.1 Vite 环境变量 参考:https://cn.vitejs.dev/guide/env-and-mode.html Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 …...
MySQL添加时间戳字段并且判断插入或更新时间
文章目录 步骤 1: 修改表结构步骤 2: 插入或更新数据步骤 3: 查询数据并判断时间完整示例 在MySQL中,可以在表中添加一个时间戳字段来记录每条数据的最后插入或更新时间。然后,在插入或更新数据时,自动更新这个时间戳字段。最后,在…...
SOA(面相服务架构)
目录 SOA的基本概念 SOA的关键特性 SOA的实现步骤 SOA的技术实现 SOA的应用场景 面向服务的架构(Service-Oriented Architecture, SOA)是一种软件设计理念和架构模式,旨在通过网络协议将不同的服务相互连接和集成,以构建灵活、可扩展和可重用的应用系统。SOA的…...
One2many(一对多)关联场景中,如何从模型(一)关联到模型(多)的某个字段
好的,我们用一个更通俗的例子来解释不同模块之间的模型关联,场景是“学校和学生”的例子。 1. 场景介绍 假设我们有两个模块: 学校模块 (school):用于管理学校信息。学生模块 (student):用于管理学生信息。 每个学…...
LLaMA 3 和 OpenAI有哪些相同点和不同点?
LLaMA 3(Meta 的 LLaMA 系列)和 OpenAI 的模型(如 GPT 系列)都是先进的 大语言模型(LLMs),它们在训练、应用场景和能力上有很多相似之处,但也存在显著的不同点。以下是一些关键相同点…...
Spring 事务管理及失效总结
所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。 Spring 并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给 Hibernate 或者 JTA 等持久化机制所提供的相关平台框架的事务来实现。 Spring 事务…...
全局思维下的联合创新:华为携手ISV伙伴助推银行核心平稳升级
文 | 螳螂观察 作者 | 李永华 随着数字金融快速发展,对核心系统提出了“海量、高效、弹性、扩展、敏捷”等新需求,区域性银行面临核心系统升级的迫切需要,对金融科技厂商而言也催生了庞大的机遇和空间。 只是,银行核心系统是金…...
深度估计任务中的有监督和无监督训练
在计算机视觉领域,深度估计任务一直是研究的热点之一。它旨在通过图像或视频数据来推断场景中物体与相机之间的距离,为许多应用提供关键信息,如自动驾驶、机器人导航、增强现实等。在深度估计任务中,有监督训练和无监督训练是两种…...
扩散模型DDPM代码实践
安装diffusers pip install diffusers 按照diffusers官方代码 from diffusers import DDPMPipelinepipe DDPMPipeline.from_pretrained("google/ddpm-cat-256")image pipe().images[0]image.save("/data/zhz/projects/diffusion/output/ddpm_generated_imag…...
关于GPIO输入模式的配置选择
GPIO(通用输入输出)口是嵌入式系统中的重要组成部分,输入模式使得微控制器能够与外部世界进行交互。本文将探讨GPIO输入模式中的浮空输入、上拉输入和下拉输入的配置、使用场景及注意事项,并提供一些决策指导,帮助读者…...
【Kubernetes】日志平台EFK+Logstash+Kafka【实战】
一,环境准备 (1)下载镜像包(共3个): elasticsearch-7-12-1.tar.gz fluentd-containerd.tar.gz kibana-7-12-1.tar.gz (2)在node节点导入镜像: ctr -nk8s.io images i…...
今天推荐一个文档管理系统 Dorisoy.Pan
Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统,它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术,以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端,包括网站、Android、iO…...
【RocketMQ】消费失败重试与死信消息
🎯 导读:本文档详细介绍了RocketMQ中的重试机制与死信消息处理方法。对于生产者而言,文档提供了如何配置重试次数的具体示例;而对于消费者,它解释了默认情况下消息消费失败后的重试策略,并展示了如何通过代…...
注册安全分析报告:闪送
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
SpringCloud入门
SpringCloud 原版笔记:狂神说笔记——SpringCloud快速入门23 - subeiLY - 博客园 (cnblogs.com) 一.前言 常见面试题 什么是微服务? 微服务之间是如何独立通讯的? SpringCloud 和 Dubbo有哪些区别? SpringBoot和SpringCloud&…...
js替换css主题变量并切换iconfont文件
iconfont不止有单色、双色的图标,还有很多【多色】的图标,于是不能【去色】,只能手动替换primary 新建一个iconfont,替换过主题色的,然后与旧的iconfont配合切换使用 主要如下: reqiure之前必须【清除缓…...
UI设计师面试整理-设计趋势和行业理解
在UI设计师的面试中,了解当前的设计趋势和行业动态可以让你在面试中展示你的前瞻性思维和对设计领域的深刻理解。面试官希望看到你不仅具备扎实的设计技能,还能够洞察和应用最新的设计趋势和技术。以下是一些当前的设计趋势和如何在面试中展示你对这些趋势的理解和应用的建议…...
Java零工市场小程序如何改变自由职业者生活
如今,自由职业者越来越多,他们需要找到合适的工作机会,Java零工市场小程序,为自由职业者提供了一个方便、快捷的寻找工作机会的方式,这样一来,改变了自由职业者找寻工作的方式,也提高了他们的收…...
android11 自动授权访问sdcard
目录 步骤1 步骤2 步骤1 frameworks/base/core/java/com/android/internal/os/ZygoteInit.java OsConstants.CAP_SYS_PTRACE,OsConstants.CAP_SYS_TIME,OsConstants.CAP_SYS_TTY_CONFIG,OsConstants.CAP_WAKE_ALARM,OsConstants.CAP_BLOCK_SUSPENDOsConstants.CAP_BLOCK_SUS…...
优青博导团队/免费指导/数据分析//论文润色/组学技术服务 、表观组分析、互作组分析、遗传转化实验、生物医学
🌟 教授团队领衔,全方位科研服务 🚀 一站式科研解决方案 📈 加速科研进程,让成果不再等待 📝 专业分析 定制服务 科研成功 👨🔬 立即行动,让科研成果跃然纸上 业务领…...
Mybatis 学习之 分页实现
文章目录 1. Mybatis1.1. 代码实现 2. Mybatis Plus2.1. 代码实现2.2. 特别注意 3. PageHelper3.1. 代码实现3.2. 特别注意 参考资料 1. Mybatis 1.1. 代码实现 package com.example.demo;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot…...
Spring Boot文件上传
配置文件上传属性: 在application.properties文件中配置文件上传的属性,包括上传目录的路径、文件大小限制等。 spring.servlet.multipart.max-file-size10MB spring.servlet.multipart.max-request-size10MB处理文件上传请求 上传的文件按照日期进行…...
基于Springboot+Vue的高校体育运动会比赛系统(含源码+数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...
直销软件网/谷歌seo服务
Android Studio: AndroidManifest.xml:11: AAPT: error: attribute android:dataExtractionRules not found. flyfish 错误如图 打开AndroidManifest.xml文件 删除 dataExtractionRules 这句...
展示型的网站开发价格/磁力天堂最佳搜索引擎入口
购买方式就业保障班购买踏实转行班 班级的选择踏实转行班与就业保障班的主课程和服务质量是一致的。 核心的区别在于就业保障班会服务上更加面面俱到,并拥有增大获取优质岗位offer可能性的专属课程(新增金融风控算法项目)。以及会有个承诺保…...
织梦cms手机网站源码/怎么交换友情链接
在ThoughtWorks的日子(第-1天) Posted on 2008-12-07 15:17 勇敢的鸵鸟 阅读(6218) 评论(22) 编辑 收藏 明天就要去报到了。今天仍然很忙,校对那本挨千刀(Google拼音居然没有这个词,山东方言,自己领会吧&a…...
做网站公司那家好/推广获客
pyramid setup参考http://docs.pylonsproject.org/en/latest/docs/pyramid.html今天是2012-03-12讲的都是安装好Python2.7,以及在ubuntu操作系统下面:1.首先装Pyramid,测试语句import setuptools,没有ImportError错误,…...
网络营销工作/sem优化软件选哪家
条款7 预先准备好内存不够的情况 operator new在无法完成内存分配请求时会抛出异常(老的编译器返回0); C常用的做法, 定义一个类型无关的宏来分配内存并检查是否成功; 123#define NEW(PTR, TYPE) \try { (PTR) new TYPE; } \catch (std::bad_alloc&) { assert(0); }>…...
免费微信h5页面制作/北京seo公司司
前言介绍 在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共存;分别是BIO、NIO和AIO。 Java BIO[Blocking …...