引言:老三取钱

有一个程序员,他的名字叫老三。

老三兜里没有钱,匆匆银行业务办。

这天起了一大早,银行姐姐说早安。

老三一看柜台空,卡里五毛都取完。

直接办理

老三这天起的晚,营业窗口都排满。

只好进入排队区,摸出手机等空闲。

老三排队等待

老三睡到上三杆,窗口排队都爆满。

经理一看开新口,排队同志赶紧办。

排队区满

这天业务太火爆,柜台排队都用完。

老三一看急上火,经理你说怎么办。

窗口,排队都爆满

经理挥手一笑间,这种场面已见惯。四种办法来处理,你猜我会怎么办。

  • 小小银行不堪负,陈旧系统已瘫痪。
  • 我们庙小对不起,谁叫你来找谁办。
  • 看你情况特别急,来去队里加个塞。
  • 今天实在没办法,不行你看改一天。

四种策略

对,没错,其实这个流程就和JDK线程池ThreadPoolExecutor的工作流程类似,先卖个关子,后面结合线程池工作流程,保证你会豁然开朗。

实战:线程池管理数据处理线程

光说不练假把式,show you code,我们来一个结合业务场景的线程池实战。——很多同学面试的时候,线程池原理背的滚瓜烂熟,一问项目中怎么用的,歇菜。看完这个例子,赶紧琢磨琢磨,项目里有什么地方能套用的。

应用场景

应用场景非常简单,我们的项目是一个审核类的系统,每年到了核算的时候,需要向第三方的核算系统提供数据,以供核算。

这里存在一个问题,由于历史原因,核算系统提供的接口只支持单条推送,但是实际的数据量是三十万条,如果一条条推送,那么起码得一个星期。

所以就考虑使用多线程的方式来推送数据,那么,线程通过什么管理呢?线程池

为什么要用线程池管理线程呢?当然是为了线程复用。

线程池实际应用场景

思路也很简单,开启若干个线程,每个线程从数据库中读取取(start,count]区间未推送的数据进行推送。

数据分段推送

具体代码实现

我把这个场景提取了出来,主要代码:

主要代码

代码比较长,所以用了carbon美化,代码看不清,没关系,可运行的代码我都上传到了远程仓库,仓库地址:fighter3/thread-demo ,这个例子比较简单,没有用过线程池的同学可以考虑你有没有什么数据处理、清洗的场景可以套用,不妨借鉴、演绎一下。

本文主题是线程池,所以我们重点关注线程池的代码:

线程池构造

//核心线程数:设置为操作系统CPU数乘以2private static final Integer CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;//最大线程数:设置为和核心线程数相同private static final Integer MAXIMUM_POOl_SIZE = CORE_POOL_SIZE;//创建线程池ThreadPoolExecutor pool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOl_SIZE * 2, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100));

线程池直接采用ThreadPoolExecutor构造:

  • 核心线程数设置为CPU数×2
  • 因为需要分段数据,所以最大线程数设置为和核心线程数一样
  • 阻塞队列使用LinkedBlockingQueue
  • 拒绝策略使用默认

线程池提交任务

//提交线程,用数据起始位置标识线程
Future<Integer> future = pool.submit(new PushDataTask(start, LIMIT, start));
  • 因为需要返回值,所以使用submit()提交任务,如果使用execute()提交任务,没有返回值。

代码不负责,可以done下来跑一跑。

那么,线程池具体是怎么工作的呢?我们接着往下看。

原理:线程池实现原理

线程池工作流程

构造方法

我们在构造线程池的时候,使用了ThreadPoolExecutor的构造方法:

    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}

先来看看几个参数的含义:

  • corePoolSize: 核心线程数

  • maximumPoolSize:允许的最大线程数(核心线程数+非核心线程数)

  • workQueue:线程池任务队列

    用来保存等待执行的任务的阻塞队列,常见阻塞队列有:

    • ArrayBlockingQueue:一个基于数组结构的有界阻塞队列
    • LinkedBlockingQueue:基于链表结构的阻塞队列
    • SynchronousQueue:不存储元素的阻塞队列
    • PriorityBlockingQueue:具有优先级的无限阻塞队列
  • handler: 线程池饱和拒绝策略

    JDK线程池框架提供了四种策略:

    • AbortPolicy:直接抛出异常,默认策略。
    • CallerRunsPolicy:用调用者所在线程来运行任务。
    • DiscardOldestPolicy:丢弃任务队列里最老的任务
    • DiscardPolicy:不处理,丢弃当前任务

    也可以根据自己的应用场景,实现RejectedExecutionHandler接口来自定义策略。

上面四个是和线程池工作流程息息相关的参数,我们再来看看剩下三个参数。

  • keepAliveTime:非核心线程闲置下来最多存活的时间
  • unit:线程池中非核心线程保持存活的时间
  • threadFactory:创建一个新线程时使用的工厂,可以用来设定线程名等

线程池工作流程

知道了几个参数,那么这几个参数是怎么应用的呢?

execute()方法提交任务为例,我们来看线程池的工作流程:

线程池工作流程

向线程池提交任务的时候:

  • 如果当前运行的线程少于核心线程数corePoolSize,则创建新线程来执行任务
  • 如果运行的线程等于或多于核心线程数corePoolSize,则将任务加入任务队列workQueue
  • 如果任务队列workQueue已满,创建新的线程来处理任务
  • 如果创建新线程使当前总线程数超过最大线程数maximumPoolSize,任务将被拒绝,线程池拒绝策略handler执行

结合一下我们开头的生活事例,是不是就对上了:

老三取钱和线程池工作流程

线程池工作源码分析

上面的流程分析,让我们直观地了解了线程池的工作原理,我们再来通过源码看看细节。

提交线程(execute)

线程池执行任务的方法如下:

    public void execute(Runnable command) {if (command == null)throw new NullPointerException();//获取当前线程池的状态+线程个数变量的组合值int c = ctl.get();//1.如果正在运行线程数少于核心线程数if (workerCountOf(c) < corePoolSize) {//开启新线程运行if (addWorker(command, true))return;c = ctl.get();}//2. 判断线程池是否处于运行状态,是则添加任务到阻塞队列if (isRunning(c) && workQueue.offer(command)) {//二次检查int recheck = ctl.get();//如果当前线程池不是运行状态,则从队列中移除任务,并执行拒绝策略if (! isRunning(recheck) && remove(command))reject(command);//如若当前线程池为空,则添加一个新线程else if (workerCountOf(recheck) == 0)addWorker(null, false);}//最后尝试添加线程,如若添加失败,执行拒绝策略else if (!addWorker(command, false))reject(command);}

我们来看一下execute()的详细流程图:

execute()具体代码执行

新增线程 (addWorker)

execute方法代码里,有个关键的方法private boolean addWorker(Runnable firstTask, boolean core),这个方法主要完成两部分工作:增加线程数添加任务,并执行

  • 我们先来看第一部分增加线程数:
        retry:for (;;) {int c = ctl.get();int rs = runStateOf(c);// 1.检查队列是否只在必要时为空(判断线程状态,且队列不为空)if (rs >= SHUTDOWN &&! (rs == SHUTDOWN &&firstTask == null &&! workQueue.isEmpty()))return false;//2.循环CAS增加线程个数for (;;) {int wc = workerCountOf(c);//2.1 如果线程个数超限则返回 falseif (wc >= CAPACITY ||wc >= (core ? corePoolSize : maximumPoolSize))return false;//2.2 CAS方式增加线程个数,同时只有一个线程成功,成功跳出循环if (compareAndIncrementWorkerCount(c))break retry;//2.3 CAS失败,看线程池状态是否变化,变化则跳到外层,尝试重新获取线程池状态,否则内层重新CASc = ctl.get();  // Re-read ctlif (runStateOf(c) != rs)continue retry;}}//3. 到这说明CAS成功了boolean workerStarted = false;boolean workerAdded = false;
  • 接着来看第二部分添加任务,并执行
       Worker w = null;try {//4.创建workerw = new Worker(firstTask);final Thread t = w.thread;if (t != null) {//4.1、加独占锁 ,为了实现workers同步,因为可能多个线程调用了线程池的excute方法final ReentrantLock mainLock = this.mainLock;mainLock.lock();try {//4.2、重新检查线程池状态,以避免在获取锁前调用了shutdown接口int rs = runStateOf(ctl.get());if (rs < SHUTDOWN ||(rs == SHUTDOWN && firstTask == null)) {if (t.isAlive()) // precheck that t is startablethrow new IllegalThreadStateException();//4.3添加任务workers.add(w);int s = workers.size();if (s > largestPoolSize)largestPoolSize = s;workerAdded = true;}} finally {mainLock.unlock();}//4.4、添加成功之后启动任务if (workerAdded) {t.start();workerStarted = true;}}} finally {if (! workerStarted)addWorkerFailed(w);}return workerStarted;

我们来看一下整体的流程:

addWorker()流程

执行线程(runWorker)

用户线程提交到线程池之后,由Worker执行,Worker是线程池内部一个继承AQS、实现Runnable接口的自定义类,它是具体承载任务的对象。

Worker类图

先看一下它的构造方法:

        Worker(Runnable firstTask) {setState(-1); // 在调用runWorker之前禁止中断this.firstTask = firstTask;this.thread = getThreadFactory().newThread(this);  //创建一个线程}
  • 在构造函数内 首先设置 state=-1,现了简单不可重入独占锁,state=0表示锁未被获取状态,state=1表示锁已被获取状态,设置状态大小为-1,是为了避免线程在运行runWorker()方法之前被中断
  • firstTask记录该工作线程的第一个任务
  • thread是具体执行任务的线程

它的run方法直接调用runWorker,真正地执行线程就是在我们的runWorker 方法里:

    final void runWorker(Worker w) {Thread wt = Thread.currentThread();Runnable task = w.firstTask;w.firstTask = null;w.unlock(); // 允许中断boolean completedAbruptly = true;try {//获取当前任务,从队列中获取任务while (task != null || (task = getTask()) != null) {w.lock();…………    try {//执行任务前做一些类似统计之类的事情beforeExecute(wt, task);Throwable thrown = null;try {//执行任务task.run();} catch (RuntimeException x) {thrown = x; throw x;} catch (Error x) {thrown = x; throw x;} catch (Throwable x) {thrown = x; throw new Error(x);} finally {// 执行任务完毕后干一些些事情afterExecute(task, thrown);}} finally {task = null;// 统计当前Worker 完成了多少个任务w.completedTasks++;w.unlock();}}completedAbruptly = false;} finally {//执行清理工作processWorkerExit(w, completedAbruptly);}}

代码看着多,其实砍掉枝蔓,最核心的点就是task.run() 让线程跑起来。

获取任务(getTask)

我们在上面的执行任务runWorker里看到,这么一句while (task != null || (task = getTask()) != null) ,执行的任务是要么当前传入的firstTask,或者还可以通过getTask()获取,这个getTask的核心目的就是从队列中获取任务

private Runnable getTask() {//poll()方法是否超时boolean timedOut = false; //循环获取for (;;) {int c = ctl.get();int rs = runStateOf(c);// 1.线程池未终止,且队列为空,返回nullif (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {decrementWorkerCount();return null;}//工作线程数int wc = workerCountOf(c);boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;//2.判断工作线程数是否超过最大线程数 && 超时判断 && 工作线程数大于0或队列为空if ((wc > maximumPoolSize || (timed && timedOut))&& (wc > 1 || workQueue.isEmpty())) {if (compareAndDecrementWorkerCount(c))return null;continue;}try {//从任务队列中获取线程Runnable r = timed ?workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :workQueue.take();//获取成功if (r != null)return r;timedOut = true;} catch (InterruptedException retry) {timedOut = false;}}}

总结一下,Worker执行任务的模型如下[8]:

Worker执行任务模型

小结

到这,了解了executeworker的一些流程,可以说其实ThreadPoolExecutor 的实现就是一个生产消费模型。

当用户添加任务到线程池时相当于生产者生产元素, workers 线程工作集中的线程直接执行任务或者从任务队列里面获取任务时则相当于消费者消费元素。

线程池生产消费模型

线程池生命周期

线程池状态表示

ThreadPoolExecutor里定义了一些状态,同时利用高低位的方式,让ctl这个参数能够保存状态,又能保存线程数量,非常巧妙![6]

    //记录线程池状态和线程数量private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));//29private static final int COUNT_BITS = Integer.SIZE - 3;private static final int CAPACITY   = (1 << COUNT_BITS) - 1;// 线程池状态private static final int RUNNING    = -1 << COUNT_BITS;private static final int SHUTDOWN   =  0 << COUNT_BITS;private static final int STOP       =  1 << COUNT_BITS;private static final int TIDYING    =  2 << COUNT_BITS;private static final int TERMINATED =  3 << COUNT_BITS;

高3位表示状态,低29位记录线程数量:

高 3 位与低 29 位

线程池状态流转

线程池一共定义了五种状态,来看看这些状态是怎么流转的[6]:

线程池状态流转

  • RUNNING:运行状态,接受新的任务并且处理队列中的任务。
  • SHUTDOWN:关闭状态(调用了 shutdown 方法)。不接受新任务,,但是要处理队列中的任务。
  • STOP:停止状态(调用了 shutdownNow 方法)。不接受新任务,也不处理队列中的任务,并且要中断正在处理的任务。
  • TIDYING:所有的任务都已终止了,workerCount 为 0,线程池进入该状态后会调terminated() 方法进入 TERMINATED 状态。
  • TERMINATED:终止状态,terminated() 方法调用结束后的状态。

应用:打造健壮的线程池

合理地配置线程池

关于线程池的构造,我们需要注意两个配置,线程池的大小任务队列

线程池大小

关于线程池的大小,并没有一个需要严格遵守的“金规铁律”,按照任务性质,大概可以分为CPU密集型任务IO密集型任务混合型任务

  • CPU密集型任务:CPU密集型任务应配置尽可能小的线程,如配置Ncpu+1个线程的线程池。
  • IO密集型任务:IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如2*Ncpu。
  • 混合型任务:混合型任务可以按需拆分成CPU密集型任务和IO密集型任务。

当然,这个只是建议,实际上具体怎么配置,还要结合事前评估和测试事中监控来确定一个大致的线程线程池大小。线程池大小也可以不用写死,使用动态配置的方式,以便调整。

任务队列

任务队列一般建议使用有界队列,无界队列可能会出现队列里任务无限堆积,导致内存溢出的异常。

线程池监控

[1]如果在系统中大量使用线程池,则有必要对线程池进行监控,方便在出现问题时,可以根据线程池的使用状况快速定位问题。

可以通过线程池提供的参数和方法来监控线程池:

  • getActiveCount() :线程池中正在执行任务的线程数量
  • getCompletedTaskCount() :线程池已完成的任务数量,该值小于等于 taskCount
  • getCorePoolSize() :线程池的核心线程数量
  • getLargestPoolSize():线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过,也就是达到了 maximumPoolSize
  • getMaximumPoolSize():线程池的最大线程数量
  • getPoolSize() :线程池当前的线程数量
  • getTaskCount() :线程池已经执行的和未执行的任务总数

还可以通过扩展线程池来进行监控:

  • 通过继承线程池来自定义线程池,重写线程池的beforeExecute、afterExecute和terminated方法,
  • 也可以在任务执行前、执行后和线程池关闭前执行一些代码来进行监控。例如,监控任务的平均执行时间、最大执行时间和最小执行时间等。

End

这篇文章从一个生活场景入手,一步步从实战到原理来深入了解线程池。

但是你发现没有,我们平时常说的所谓四种线程池在文章里没有提及——当然是因为篇幅原因,下篇就安排线程池创建工具类Executors

线程池也是面试的重点战区,面试又会问到哪些问题呢?

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 纯CSS实现图片动画

    纯CSS实现图片动画 1、先网上下载一张sprites动画图片&#xff0c;直接百度搜sprites图片就可。2、用css设置一个关键帧&#xff0c;确定好起始位置和终止位置&#xff0c;通过background-position调整背景图片在div框中显示的位置。图片可以用ps查看像素大小&#xff0c;便于…...

    2024/4/26 1:00:24
  2. 147. 对链表进行插入排序

    147. 对链表进行插入排序题目描述思路分析代码实现题目描述 点这里 思路分析 链表排序 插入排序&#xff0c;类似于整理扑克牌。每次把插入数插入到比他大的第一个数前边。 代码实现 /*** Definition for singly-linked list.* struct ListNode {* int val;* List…...

    2024/4/21 1:11:03
  3. 如何学好windows c++编程 学习精髓(收集,整理)

    以下是很多VC爱好者的学习经历,希望对大家有所帮助: 我记得我在网上是这么说的:先学win32的SDK,也就是API, 再学MFC,这么一来呢,就先有个基础,MFC是API的封装, 如果API用的熟了,MFC上手就轻松的多了。 我觉得呢,现在不少WINDOWS编程入门的好书很多,多买一些,多看看,…...

    2024/4/25 14:34:48
  4. Unity 用粒子排列成图片

    1.首先来一张PNG图片 2.将图片拖入Unity中&#xff0c;尺寸越大&#xff0c;像素点越高&#xff0c;粒子也就增多 3.添加GetPixel代码&#xff0c;作用是获取图片像素的坐标位置&#xff0c;来源这里 using System.Collections; using System.Collections.Generic; using Uni…...

    2024/4/23 2:37:31
  5. Java基础:Vector基本操作

    Vector 类实现了一个动态数组。和 ArrayList 很相似&#xff0c;但是两者是不同的&#xff1a; Vector 是同步访问的。 Vector 包含了许多传统的方法&#xff0c;这些方法不属于集合框架。 Vector 主要用在事先不知道数组的大小&#xff0c;或者只是需要一个可…...

    2024/4/22 2:32:43
  6. HTML简单的时间登入注册界面设计

    1.程序代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>按钮测试</title> </head> <body> <link href"test.css" rel"stylesheet"type&qu…...

    2024/4/20 6:03:30
  7. 如何清空运行界面——求助

    刚学python&#xff0c;最近想做这样一个功能&#xff0c;就是实现在一个界面中的已输出内容的清空&#xff0c;比如&#xff0c; choiceinput("input your choice&#xff1a;") if choice"1":pass# 执行下一个界面的内容&#xff0c;将原来界面已输出的…...

    2024/4/25 15:34:51
  8. Python中使用多进程时if __name__ == ‘__main__‘ 在不同操作系统里的必要性

    代码如下&#xff1a; import multiprocessingdef dance():"""跳舞"""print(The beauty is dancing)# if __name__ __main__:# 通过进程类创建进程对象dance_process multiprocessing.Process(targetdance)# 启动子进程dance_process.start()w…...

    2024/4/25 14:57:16
  9. 最简单的php 加解密字符串

    这么简单的代码&#xff0c;就直接上了。 用$string[$i] 可以取到字母&#xff0c; 用$code. 可以连接字母&#xff0c;转成c语言也很简单。 了解一下加解密的思想&#xff0c;这个小算法也有用途&#xff0c;可直接拿去使用。 <?php function encrypt_simple($string) …...

    2024/4/25 20:23:21
  10. leetcode刷题 42接雨水

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 解题思路&#xff1a; 先取i号柱子和j号柱子&#xff08;i<j&#xff09;两根柱子&#xff0c;做以下假设&#xff1a; 1.i号柱子和j号柱子之间的柱子的…...

    2024/4/20 11:58:17
  11. SECS通讯

    连接整理 https://www.cnblogs.com/7star/p/12815219.html...

    2024/4/26 4:34:08
  12. 7.适配器模式

    引入 在阎宏博士的《JAVA与模式》一书中开头是这样描述适配器&#xff08;Adapter&#xff09;模式的&#xff1a; 适配器模式把一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 用电器做例子&…...

    2024/4/24 6:48:10
  13. 技术文档 - 需求变更文档

    1. 软件开发项目中的 “需求变更”分析 和 “解决之道” “ 需求变更”&#xff0c;一旦提到软件开发项目进程中的需求变更&#xff0c;无论是项目经理还是程序开发人员都感觉到头疼。而且&#xff0c;在一些项目管理顾问的PPT课件中&#xff0c;以及一些软件项目管理的技术图书…...

    2024/4/16 11:56:27
  14. UG NX 12 图形区

    图形区是UG NX 12用户主要的工作区域&#xff0c;建模的主要过程、绘制前后的零件图形、分析结果和模拟仿真过程等都在这个区域内显示。用户可以直接在图形区中选取相关对象进行操作。 同时还可以选择多种视图操作方式&#xff1a; 方法一&#xff1a;右击图形区&#xff0c;…...

    2024/4/20 16:11:39
  15. 【 总结 】作用域

    执行期的上下文 当代码执行的前期,创建一个执行期的上下文的内部对象AO(作用域)这个内部的对象是预编译的时候创建的 因为当函数被调用的时候 会先进行预编译在全局代码执行的前期会创建一个执行期的上下文对象GO 函数作用域的预编译 创建AO对象 AO{ }找形参和变量声明 将变…...

    2024/4/25 9:05:34
  16. 二叉树遍历方式-先序、中序、后序和层序遍历(JAVA)

    一、树型结构 在认识二叉树之前&#xff0c;我们可以先了解一下什么叫树。 数据结构中的树&#xff0c;和我们生活中的树是有类似之处的。其实是一种非线性的数据结构。它具有以下的特点&#xff1a;每个结点有零个或多个子结点&#xff1b;没有父结点的结点称为根结点&#x…...

    2024/4/20 15:27:13
  17. shell 作业四

    1. 使用case实现成绩优良中差的判断 2. for创建20用户 用户前缀由用户输入 用户初始密码由用户输入 例如&#xff1a;test01,test10 3. for ping测试指网段的主机 网段由用户输入&#xff0c;例如用户输入192.168.2 &#xff0c;则ping 192.168.2.10 --- 192.168.2.20 UP&#…...

    2024/4/19 17:05:07
  18. form表单提交数据

    let forms = new FormData(); Object.keys(this.form).forEach(item => {if (this.form[item]...

    2024/4/25 11:05:17
  19. 索引失效的情况有哪些?

    文章目录列与列对比索引列存在NULL值NOT条件LIKE通配符条件上包括函数复合索引前导列区分大数据类型的转换Connect By、Level谓词运算列与列对比 某个表中&#xff0c;有两列&#xff08;mobile和phone&#xff09;都建了单独索引&#xff0c;下面这种查询不会走索引&#xff…...

    2024/4/22 2:05:04
  20. [Life Sciences.AI]专栏介绍及内容分类(持续更新......)

    主要记录多肽和蛋白等生物大分子相关的操作和与人工智能的结合。 蛋白相关 蛋白Ramachandran(拉氏图、拉曼图&#xff09;的绘制和可视化 Biopython | 计算蛋白质的接触图(contact map) RDKit相关 RDKit | 读取PDB文件并可视化...

    2024/4/25 1:00:52

最新文章

  1. 深入了解计算机系统——利用循环展开对程序的优化

    系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 文章目录 一些概念CPE 初步优化消除不必…...

    2024/4/26 5:01:56
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Linux学习-网络UDP

    网络 数据传输,数据共享 网络协议模型 OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报、流式&#…...

    2024/4/14 6:29:01
  4. 备战蓝桥杯Day37 - 真题 - 特殊日期

    一、题目描述 思路&#xff1a; 1、统计2000年到2000000年的日期&#xff0c;肯定是需要遍历 2、闰年的2月是29天&#xff0c;非闰年的2月是28天。我们需要判断这一年是否是闰年。 1、3、5、7、8、10、12月是31天&#xff0c;4、6、9、11月是30天。 3、年份yy是月份mm的倍数…...

    2024/4/24 9:33:16
  5. 2024蓝桥杯每日一题(区间DP)

    备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;游戏 试题二&#xff1a;石子合并 试题三&#xff1a;密码脱落 试题四&#xff1a;能量项链 试题一&#xff1a;游戏 【题目描述】 玩家一和玩家二共同玩一个小游戏。给定一个包含 N 个…...

    2024/4/25 11:04:14
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57