多线程使用时机

出现CPU资源浪费(CPU空转)的时候才适用多线程,每个核心在同一时刻只能处理一个线程,而逻辑处理器则是通过CPU的并发来模拟出的核心

单线程与多线程使用情况

适用单线程的情况

CPU全力执行,没有产生算力浪费的情况下适用单线程,多线程需要额外花费算力执行其他工作

多线程消耗

每个线程在执行时只执行极短的时间,然后去执行其他线程,每次切换之前要记录本次执行的数据,会额外耗费资源和时间,所以会有消耗时间,而每个线程之间切换的速度越快,消耗的时间就越多,下图中切换执行3个线程的消耗时间是1+2+3 =6s,执行总时间是6+60=66s

在这里插入图片描述

单线程没有消耗

而如果不切换顺序执行的话由于不需要消耗时间只需要耗费60s的时间,在这种情况下单线程比多线程更有优势
在这里插入图片描述

适用多线程的情况

面试点:java请求数据库

当需要调用数据库时,java进程通过jdbc发送http请求到端口(通常是3306)传递SQL语句字符串到mysql进程

mysql进程一直监听着3306端口,当接收到http请求时解析出SQL语句,通过SQL语句的执行消耗一部分内存把存储在磁盘中想要操作的表文件(一个表就是一个文件)加载到mysql中

mysql进程通过解析java的SQL语句进行处理,得出java想要查询的数据后通过3306端口返回到java进程中

数据库原理:数据库是用c实现的,Navicat是c实现的可视化,上述过程换成c的话就是数据库的实现原理

消耗点

当mysql进程调用磁盘中存储的表文件时,由于磁盘读取速度限制,会消耗大量的时间在上面(通常单个表文件是几十ms),在等待读取的这段时间,CPU在打空转造成了资源浪费,所以如果是单线程调度时每次都要等待,这时使用多线程就可以在CPU等待磁盘调度时去执行其他线程

所有等待时间远大于执行时间的场景都可以使用多线程

如下列执行时间只要2ms,等待时间却要50ms,这时就可以使用多线程让等待的时间里也能处理其他的线程

image-20220617112229523

多线程执行图

当我们创建10个线程后不需要手动去切换线程,只需要全部点击start,CPU会自己进行切换

多线程使用场景

网络爬虫,数据库进行批量操作时

多线程分配

如果用10个线程分配10000个抓取任务,如果给每个线程分配1000个是不科学的,因为线程执行速度有快有慢

所以实际执行时是将10000个抓取任务放在一个队列中,10个线程谁执行完了就来领下一个

所以在代码设计时,就要new10个线程和一个队列,而线程池就简化了这一流程,只需要将线程数量和队列当做参数输入就可以创建

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐