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

Java线程池七个参数详解

ThreadPoolExecutor 是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交、线程管理、监控等方法

下面是 ThreadPoolExecutor 类的构造方法源码,其他创建线程池的方法最终都会导向这个构造方法,共有7个参数:

corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();this.acc = System.getSecurityManager() == null ?null :
            AccessController.getContext();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;
}

这些参数大部分都是通过 volatile 修饰

public class ThreadPoolExecutor extends AbstractExecutorService {

private volatile int corePoolSize; // 1.核心线程数

private volatile int maximumPoolSize; // 2.最大线程数

private volatile long keepAliveTime; // 3.空闲线程存活时间

TimeUnit unit; // 4. 存活时间单位

private final BlockingQueue<Runnable> workQueue; // 5.工作队列

private volatile ThreadFactory threadFactory; // 6.线程工厂

private volatile RejectedExecutionHandler handler; // 7.拒绝策略

private volatile boolean allowCoreThreadTimeOut; // 是否允许核心线程被回收

}

一、corePoolSize:核心线程数

线程池维护的最小线程数量,核心线程创建后不会被回收(注意:设置 allowCoreThreadTimeout = true 后,空闲的核心线程超过存活时间也会被回收)

大于核心线程数的线程,在空闲时间超过keepAliveTime后会被回收

线程池刚创建时,里面没有一个线程,当调用 execute() 方法添加一个任务时,如果正在运行的线程数量小于corePoolSize,则马上创建新线程并运行这个任务

二、maximumPoolSize:最大线程数

线程池允许创建的最大线程数量

当添加一个任务时,核心线程数已满,工作队列已满的情况下,线程池还没达到最大线程数,并且没有空闲线程,创建一个新线程并执行

三、keepAliveTime:空闲线程存活时间

当一个可被回收的线程的空闲时间大于keepAliveTime,就会被回收

可被回收的线程:

设置allowCoreThreadTimeout = true的核心线程

大于核心线程数的线程(非核心线程)

四、unit:时间单位

keepAliveTime 的时间单位:

TimeUnit.NANOSECONDS // 纳秒

TimeUnit.MICROSECONDS // 微秒

TimeUnit.MILLISECONDS // 毫秒

TimeUnit.SECONDS // 秒

TimeUnit.MINUTES // 分钟

TimeUnit.HOURS // 小时

TimeUnit.DAYS // 天

五、workQueue:工作队列

作用:存放待执行任务的队列。当提交的任务数超过核心线程数大小后,再提交的任务就存放在工作队列,任务调度时再从队列中取出任务。它仅仅用来存放被 execute() 方法提交的 Runnable 任务。工作队列实现了 BlockingQueue 接口

JDK默认的工作队列有五种

5.1 ArrayBlockingQueue:数组型阻塞队列。

数组结构,初始化时传入大小(有界),FIFO(先进先出策略)。使用一个重入锁(ReentrantLock),默认使用非公平锁,入队和出队共用一个锁,互斥

final ReentrantLock lock = this.lock;

5.2 LinkedBlockingQueue:链表型阻塞队列。

链表结构,默认初始化大小为Integer.MAX_VALUE,有界(近似无界),FIFO(先进先出策略)。使用两个重入锁分别控制元素的入队和出队,用 Condition 进行线程间的唤醒和等待

// 初始化构造,也有自定义大小capacity参数
public LinkedBlockingQueue() {this(Integer.MAX_VALUE);
}// 两把锁
/** Lock held by take, poll, etc */
private final ReentrantLock takeLock = new ReentrantLock();/** Wait queue for waiting takes */
private final Condition notEmpty = takeLock.newCondition();/** Lock held by put, offer, etc */
private final ReentrantLock putLock = new ReentrantLock();/** Wait queue for waiting puts */
private final Condition notFull = putLock.newCondition();

5.3 SynchronousQueue:同步移交队列。

容量为0,添加任务必须等待取出任务,这个队列相当于通道,不存储元素

5.4 PriorityBlockingQueue:优先级阻塞队列。

无界,在 put 的时候会tryGrow,要说它有界也没问题,因为界是 Integer.MAX_VALUE,但其实上这个队列应该是无界的。默认采用元素自然顺序升序排列(可以自定义Comparator)。使用一个重入锁分别控制元素的入队和出队

/**
 * Default array capacity.	默认初始化大小 11
 */
private static final int DEFAULT_INITIAL_CAPACITY = 11;
public PriorityBlockingQueue() {
	this(DEFAULT_INITIAL_CAPACITY, null);
}/**
 * Lock used for all public operations
 */
private final ReentrantLock lock;/**
 * Condition for blocking when empty
 */
private final Condition notEmpty;

5.5 DelayQueue:延时队列。

无界,队列中的元素有过期时间,过期的元素才能被取出。使用一个重入锁分别控制元素的入队和出队,用 Condition 进行线程间的唤醒和等待。任务调度时候可以使用

private final transient ReentrantLock lock = new ReentrantLock();
private final Condition available = lock.newCondition();

队列分类

无界队列

队列大小无限制,常用的无界的队列为 LinkedBlockingQueue,使用该队列做为阻塞队列时要尤其当心,当任务耗时较长时可能会导致大量新任务在队列中堆积最终导致OOM

有界队列

常用的有两类,一类是遵循FIFO原则的队列如 ArrayBlockingQueue,另一类是优先级队列如 PriorityBlockingQueue, PriorityBlockingQueue 中的优先级由任务的Comparator决定

使用有界队列时队列大小需和线程池大小互相配合,线程池较小有界队列较大时可减少内存消耗,降低cpu使用率和上下文切换,但是可能会限制系统吞吐量

同步移交队列

如果不希望任务在队列中等待而是希望将任务直接移交给工作线程,可使用 SynchronousQueue 作为等待队列。SynchronousQueue 不是一个真正的队列,而是一种线程之间移交的机制。要将一个元素放入 SynchronousQueue 中,必须有另一个线程正在等待接收这个元素。只有在使用无界线程池或者有饱和策略时才建议使用该队列

六、threadFactory:线程工厂

创建线程的工厂,可以设定线程名、线程编号等

默认创建的线程工厂,通过Executors.defaultThreadFactory()获取

    /**
     * The default thread factory
     */
    static class DefaultThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;        DefaultThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" +
                          poolNumber.getAndIncrement() +
                         "-thread-";
        }        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                                  namePrefix + threadNumber.getAndIncrement(),
                                  0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }

七、handler:拒绝策略

当线程池线程数已满,并且工作队列达到限制,新提交的任务使用拒绝策略处理。可以自定义拒绝策略,拒绝策略需要实现 RejectedExecutionHandler 接口

JDK默认的拒绝策有四种

AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常

DiscardPolicy:丢弃任务,但是不抛出异常。可能导致无法发现系统的异常状态

DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务

CallerRunsPolicy:由调用线程处理该任务

默认拒绝策略是 AbortPolicy

/**
 * A handler for rejected tasks that throws a
 * {@code RejectedExecutionException}.
 */
public static class AbortPolicy implements RejectedExecutionHandler {/**
     * Creates an {@code AbortPolicy}.
     */public AbortPolicy() { }/**
     * Always throws RejectedExecutionException.
     *
     * @param r the runnable task requested to be executed
     * @param e the executor attempting to execute this task
     * @throws RejectedExecutionException always
     */public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {throw new RejectedExecutionException("Task " + r.toString() +" rejected from " +
                                             e.toString());}
}

八、拓展

线程池的执行流程

自定义线程池工具

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;public class ThreadPoolFactory {public static void main(String[] args) {// 测试线程池方法
        ExecutorService threadPool = createFixedThreadPool("vinjcent");for (int i = 0; i <= 20; i++) {
            int number = i;
            threadPool.execute(new Runnable() {@Overridepublic void run() {
                    System.out.println(Thread.currentThread().getName() + "===>" + number);}});}// 使用完之后记得关闭
        threadPool.shutdown();}public static ExecutorService createFixedThreadPool(String threadName) {// 用于创建线程时,每个线程名称不同的增值
        AtomicInteger threadNumber = new AtomicInteger(0);return new ThreadPoolExecutor(// 核心线程数defaultThreadNum(),// 最大线程数(这里我们使用I/O密集型)defaultThreadNum(),// 空闲线程存活时间 15s15L,// 空闲线程存活时间单位
                TimeUnit.SECONDS,// 工作队列(使用数组型阻塞队列)new ArrayBlockingQueue<>(1024),// 创建线程工厂new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {// 为工厂创建的每一个线程的格式化名字 threadName-No.[0,1,2,3...]return new Thread(r, threadName + "-No." + threadNumber.getAndIncrement());}},// 拒绝策略,自定义new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 如果线程池没有关闭if (!executor.isShutdown()) {// 尝试将当前任务添加到任务队列中try {
                                executor.getQueue().put(r);} catch (InterruptedException e) {// 保持线程的中断状态
                                Thread.currentThread().interrupt();}}}});}/**
     * 默认的线程数,使用2倍的cpu核心数
     *
     * 核心线程数分配
     * CPU密集型: 核心线程数 = CPU核心数(或核心线程数 = CPU核心数 + 1)
     * I/O密集型: 核心线程数 = 2 * CPU核心数(或核心线程数 = CPU核心数 / (1 - 阻塞系数))
     * 混合型: 核心线程数 = (线程等待时间 / 线程CPU时间 + 1) * CPU核心数
     *
     * 最大线程数分配
     * IO密集型经验应用,最大线程设置为 2N+1 (N为CPU数量,下同)
     * CPU密集型应用,最大线程设置为 N+1
     *
     * 线程数 = CPU 核心数 * (1 + IO 耗时/ CPU 耗时)
     */public static int defaultThreadNum() {return Runtime.getRuntime().availableProcessors() * 2;}}

合理设计线程池大小

CPU 密集型任务

比如像加解密,压缩、计算等一系列需要大量耗费 CPU 资源的任务,大部分场景下都是纯 CPU 计算。IO 密集型任务:比如像 MySQL 数据库、文件的读写、网络通信等任务,这类任务不会特别消耗 CPU 资源,但是 IO 操作比较耗时,会占用比较多时间。在知道如何判断任务的类别后,让我们分两个场景进行讨论:

对于 CPU 密集型计算,多线程本质上是提升多核 CPU 的利用率,所以对于一个 8 核的 CPU,每个核一个线程,理论上创建 8 个线程就可以了

如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍,因为计算任务非常重,会占用大量的 CPU 资源,所以这时 CPU 的每个核心工作基本都是满负荷的,而我们又设置了过多的线程,每个线程都想去利用 CPU 资源来执行自己的任务,这就会造成不必要的上下文切换,此时线程数的增多并没有让性能提升,反而由于线程数量过多会导致性能下降

因此,对于 CPU 密集型的计算场景,理论上线程的数量 = CPU 核数就是最合适的,不过通常把线程的数量设置为CPU 核数 +1,会实现最优的利用率

即使当密集型的线程由于偶尔的内存页失效或其他原因导致阻塞时,这个额外的线程也能确保 CPU 的时钟周期不会被浪费,从而保证 CPU 的利用率

IO 密集型任务

对于 IO 密集型任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,就可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源

对于 IO 密集型计算场景,最佳的线程数是与程序中 CPU 计算和 IO 操作的耗时比相关的,《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法如下:

线程数 = CPU 核心数 * (1 + IO 耗时/ CPU 耗时)

通过这个公式,我们可以计算出一个合理的线程数量,如果任务的平均等待时间长,线程数就随之增加,而如果平均工作时间长,也就是对于我们上面的 CPU 密集型任务,线程数就随之减少

相关文章:

Java线程池七个参数详解

ThreadPoolExecutor 是JDK中的线程池实现&#xff0c;这个类实现了一个线程池需要的各个方法&#xff0c;它提供了任务提交、线程管理、监控等方法 下面是 ThreadPoolExecutor 类的构造方法源码&#xff0c;其他创建线程池的方法最终都会导向这个构造方法&#xff0c;共有7个参…...

产品Web3D交互展示有什么优势?如何快速制作?

智能互联网时代&#xff0c;传统的图片、文字、视频等产品展示方式&#xff0c;因为缺少互动性&#xff0c;很难引起用户的兴趣&#xff0c;已经逐渐失去了宣传优势。 Web3D交互展示技术的出现&#xff0c;让众多品牌和企业找到了新的方向&#xff0c;线上产品展示不在枯燥无趣…...

Python | Leetcode Python题解之第171题Excel列表序号

题目&#xff1a; 题解&#xff1a; class Solution:def titleToNumber(self, columnTitle: str) -> int:number, multiple 0, 1for i in range(len(columnTitle) - 1, -1, -1):k ord(columnTitle[i]) - ord("A") 1number k * multiplemultiple * 26return n…...

【银河麒麟】高可用触发服务器异常重启,处理机制详解

1.服务器环境以及配置 【机型】物理机 处理器&#xff1a; Intel 内存&#xff1a; 126G 【内核版本】 4.19.90-25.16.v2101.ky10.x86_64 【银河麒麟操作系统镜像版本】 Kylin-Server-10-SP2-Release-Shenzhen-Metro-x86-Build01-20220619 Kylin-HA-10-SP2-Release-S…...

性能工具之 JMeter 常用组件介绍(七)

文章目录 一、后置处理器1、Regular Expression Extractor(正则表达式提取器)2、JSON Extractor(JSON表达式提取器)3、Regular Expression Extractor(正则表达式提取器) 二、小结 本文主要介绍JMeter主流后置处理器的功能 一、后置处理器 从上面可以看出后置处理可以插件挺多&a…...

Python学习笔记15:进阶篇(四)文件的读写。

文件操作 学习编程操作中&#xff0c;我觉得文件操作是必不可少的一部分。不管是读书的时候学习的c&#xff0c;c&#xff0c;工作的前学的java&#xff0c;现在学的Python&#xff0c;没学过的php和go&#xff0c;都有文件操作的模块以及库的支持&#xff0c;重要性毫无疑问。…...

角度调制与解调电路

music&#xff01; &#xff08;黄佳庆老师可爱捏&#xff09; 调角 角度调制有较好的抗噪性能。 调相 相位变化的频率变化的微分&#xff0c;频率变化是相位变化的积分 相位的变化率就是频率 调频 调相与调频的关系 大F是输入信号的频率&#xff0c;大Ω是输入信号的角频率 …...

数据分析:微生物组差异丰度方法汇总

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 微生物数据具有一下的特点&#xff0c;这使得在做差异分析的时候需要考虑到更多的问题&…...

Linux驱动开发(二)--字符设备驱动开发提升 LED驱动开发实验

1、地址映射 在编写驱动之前&#xff0c;需要知道MMU&#xff0c;也就是内存管理单元&#xff0c;在老版本的 Linux 中要求处理器必须有 MMU&#xff0c;但是现在Linux 内核已经支持无 MMU 的处理器了。 MMU的功能如下&#xff1a; 完成虚拟空间到物理空间的映射 内存保护&…...

钡铼BL101网关助力智慧城市路灯远程智能管控

在迈向智慧城市的征途中&#xff0c;基础设施的智能化改造是关键一环&#xff0c;而路灯作为城市脉络的照明灯塔&#xff0c;其智能化升级对于节能减排、提升城市管理效率具有重要意义。钡铼BL101网关&#xff0c;作为Modbus转MQTT的专业桥梁&#xff0c;正以其卓越的性能和广泛…...

如何优雅的使用Github Action服务来将Hexo部署到Github Pages

文章目录 参考文章前提条件1. 初始化Hexo2. 初始化仓库3. 创建Token4. 修改_config.yml5. 配置Github Action工作流6. 推送验证7. 配置Github Pages8. 修改Hexo主题样式10. 添加文章遇到了一些问题和方案1. 网站没有样式问题2. 图片不显示 参考文章 Bilibili视频教程-9分钟零成…...

After Effects 2024 mac/win版:创意视效,梦想起航

After Effects 2024是一款引领视效革命的专业软件&#xff0c;汇聚了创意与技术的精华。作为Adobe推出的全新版本&#xff0c;它以其强大的视频处理和动画创作能力&#xff0c;成为从事设计和视频特技的机构&#xff0c;如电视台、动画制作公司、个人后期制作工作室以及多媒体工…...

信息打点web篇----web后端源码专项收集

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 专栏描述&#xff1a;因为第一遍过信息收集的时候&#xff0c;没怎么把收集做回事 导致后来在实战中&#xff0c;遭遇资产获取少&#xff0c;可渗透点少的痛苦&#xff0c;如今决定 从头来过&#xff0c;全面全方位…...

ArcGIS批量投影转换的妙用(地理坐标系转换为平面坐标系)

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 这次文章我们来介绍一下&#xff0c;如何巧妙用要素数据集来实现要素的批量投影。不需要ArcGIS的模型构建器与解决。 例如&#xff0c;有多个要素要将CGCS_2000地理坐标系投…...

YOLOv10训练自己的数据集(图像目标检测)

目录 1、下载代码 2、环境配置 3、准备数据集 4、yolov10训练 可能会出现报错&#xff1a; 1、下载代码 源码地址&#xff1a;https://github.com/THU-MIG/yolov10 2、环境配置 打开源代码&#xff0c;在Terminal中&#xff0c;使用conda 创建虚拟环境配置 命令如下&a…...

解决不能拉取 docker 镜像

# 编辑镜像仓库文件 sudo vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com","https://s3d6l2fh.mirror.aliyuncs.com"] }# 重启docker sudo systemctl restart docker参考 https://blog.csdn.net/u01019733…...

44、基于深度学习的癌症检测(matlab)

1、基于深度学习的癌症检测原理及流程 基于深度学习的癌症检测是利用深度学习算法对医学影像数据进行分析和诊断&#xff0c;以帮助医生准确地检测癌症病变。其原理和流程主要包括以下几个步骤&#xff1a; 数据采集&#xff1a;首先需要收集包括X光片、CT扫描、MRI等医学影像…...

Vue3 【仿 react 的 hook】封装 useTitle

效果预览 页码加载时&#xff0c;自动获取网页标题通过input输入框&#xff0c;可以实时改变网页标题 代码实现 index.vue <template><h1>网页的标题为&#xff1a; {{ titleRef }}</h1><p>通过input输入框实时改变网页的标题 <input v-model"…...

CSS 计数器

CSS 计数器 CSS 计数器是 CSS 中一个强大但经常被忽视的功能。它们允许开发者创建和管理计数器,这些计数器可以在文档中自动递增,非常适合用于编号章节、列表项或其他文档元素。在本文中,我们将深入探讨 CSS 计数器的使用方法、优势和实际应用场景。 CSS 计数器的基本概念…...

磁力搜索器,解读新一代的搜索引擎方式,磁力王、磁力猫等引擎的异同及原理

最近国内几年&#xff0c;不依赖追踪服务器的磁力搜索开始流行&#xff0c;成为新的资源搜索的方式。 我们平常所说的磁力王&#xff08;jigecili.com)、磁力猫(yinghuacili.com)、bt磁力&#xff08;btcili.cn)、磁力狗最新版&#xff08;cilizhai.net)、磁力兔子、磁力宝、人…...

Apache Doris 全新分区策略 Auto Partition 应用场景与功能详解 | Deep Dive系列

编辑&#xff1a;SelectDB 技术团队 在当今数据驱动的时代&#xff0c;如何高效、有序地管理数据库中的海量数据成为挑战。为了处理庞大的数据集&#xff0c;分布式数据库引入了类似分区和分桶策略&#xff0c;通过将数据按特定规则划分成较小的单位并分布到不同节点上&#x…...

【Linux】关于在华为云中开放了端口后仍然无法访问的问题

已在安全组中添加规则: 通过指令: netstat -nltp | head -2 && netstat -nltp | grep 8080 运行结果: 可以看到服务器确实处于监听状态了. 通过指令 telnet 公网ip port 也提示: "正在连接xxx.xx.xx.xxx...无法打开到主机的连接。 在端口 8080: 连接失败"…...

Linux系统ubuntu20.04 无人机PX4 开发环境搭建(失败率很低)

Linux系统ubuntu20.04 无人机PX4 开发环境搭建 PX4固件下载开发环境搭建MAVROS安装安装地面站QGC PX4固件下载 PX4的源码处于GitHub&#xff0c;因为众所周知的原因git clone经常失败&#xff0c;此处从Gitee获取PX4源码和依赖模块。 git clone https://gitee.com/voima/PX4-…...

中间件(express)

中间件&#xff08;express&#xff09; 在Express.js中&#xff0c;中间件&#xff08;Middleware&#xff09;是一个重要的组成部分&#xff0c;用于处理HTTP请求和响应。中间件函数具有特定的签名&#xff0c;并可以接受请求对象&#xff08;req&#xff09;、响应对象&…...

【代码随想录算法训练Day44】LeetCode 322.零钱兑换、LeetCode 279.完全平方数、LeetCode139.单词拆分

Day44 动态规划第六天 LeetCode 322.零钱兑换 dp数组的含义&#xff1a;装满容量为j的背包需要的最少物品数为dp[j] 递推公式&#xff1a;dp[j]min(dp[j-coins[i]]1,dp[j]) 初始化&#xff1a;dp[0]0,dp[j]INT_MAX 遍历顺序&#xff1a;个数问题与遍历顺序无关&#xff0c;都…...

ChatGLM2-6B 部署

本文主要对 ChatGLM2-6B 模型的部署和推理过程进行介绍。 一、部署环境 在阿里云服务器上部署&#xff0c;具体环境如下&#xff1a; modelscope:1.9.5 pytorch 2.0.1 tensorflow 2.13.0 python 3.8 cuda 118 ubuntu 20.04 CPU 8 core 内存 30 GiB GPU NVIDIA A10 2…...

武汉工程大学24计算机考研数据,有学硕招收调剂,而专硕不招收调剂!

武汉工程大学是一所以工为主&#xff0c;覆盖工、理、管、经、文、法、艺术、医学、教育学等九大学科门类的多科性教学研究型大学&#xff0c;是湖北省重点建设高校、湖北省国内一流学科建设高校&#xff0c;入选卓越工程师教育培养计划、中西部高校基础能力建设工程、“新工科…...

python爬虫之selenium自动化操作

python爬虫之selenium自动化操作 需求&#xff1a;操作淘宝去掉弹窗广告搜索物品后进入百度回退又前进 selenium模块的基本使用 问题&#xff1a;selenium模块和爬虫之间具有怎样的关联? 1、便捷的获取网站中动态加载的数据 2、便捷实现模拟登录 什么是selenium模块&#x…...

【漏洞复现】红帆iOffice.net wssRtSyn接口处存在SQL注入

【产品&&漏洞简述】 红帆iOffice.net从最早满足医院行政办公需求&#xff08;传统OA&#xff09;&#xff0c;到目前融合了卫生主管部门的管理规范和众多行业特色应用&#xff0c;是目前唯一定位于解决医院综合业务管理的软件&#xff0c;是最符合医院行业特点的医院综…...

云计算【第一阶段(17)】账号和权限管理

目录 一、用户账号和组账号概述 1.1、用户账号的三种角色 1.2、组账号的两个角色 二、用户账号文件 2.1、/etc/passwd 2.2、/etc/shadow 2.3、chage 命令 三、组账号文件 3.1、/etc/group 3.2、/etc/gshadow 四、添加组账户 4.1、添加删除组成员 4.2、删除组账号 …...

域名备案 没有网站/武汉seo招聘信息

编号&#xff1a;0737 座位号 2018&#xff5e;2019学年度第二学期期末考试 烹饪原料学&#xff08;2&#xff09;试题 2019年4月 一、名词解释&#xff08;本大题共4小题&#xff0c;每题5分&#xff0c;共20分&#xff09;。 高温贮藏法 辅助原料 色拉油 香辛料 二、单…...

网站翻页功能/免费私人网站建设

窗体抖动案例 首先将窗体在当前屏幕居中 其次使用for循环实现都行的次数 最后利用left,top实现窗体的抖动 private void Form2_Load(object sender, EventArgs e){this.CenterToScreen();//将窗体在当前屏幕居中}private void button1_Click(object sender, EventArgs e)//…...

动力网站/网站推广和优化系统

监理目标控制的前提工作是()。监理渐开线齿轮的加工方法按其切齿原理可分为______和_______两种。目标Please fill in the blank with the words below:pleasure overcome balancing social mutuallyartificial islands in side-effect unexpectedly Twofriendsarelikemagnets.…...

上海做网站哪家便宜/合肥seo优化

我有一個類似的問題&#xff0c;對於加密/解密我提出了這個解決方案&#xff1a;public static byte[] generateKey(String password) throws Exception{byte[] keyStart password.getBytes("UTF-8");KeyGenerator kgen KeyGenerator.getInstance("AES")…...

兼容性视图中显示所有网站/优化系统

17岁中专毕业的刘博文&#xff0c;成为了低学历程序员逆袭的最佳范本。 作为一个在2012年还只有中专文凭的“半吊子”程序员&#xff0c;却在短短几年间做到了360奇舞团的一员&#xff0c;2019年甚至以资深人士的角度出版自己的技术书籍…… 从起初的一知半解到如今独当一面&am…...

做网站 提要求/人民日报官网

在SQL中判断一个表是否存在 <%sql"if exists (select * from sysobjects where id object_id(N[dbo].[phone]) and OBJECTPROPERTY(id, NIsUserTable) 1) drop table [dbo].[phone]" con.execute(sql) %> 如果表phone存在则删除phone表&#xf…...