单线程与多线程使用场景

本文探讨了多线程的使用时机,指出当存在CPU空转或I/O等待时,多线程能有效利用资源。例如在数据库操作中,因磁盘读取延迟,多线程可以避免CPU浪费。同时,介绍了如何智能分配线程任务,如使用线程池,以优化执行效率。最后,提到了网络爬虫和批量数据库操作作为多线程的典型应用场景。

多线程使用时机

出现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个线程和一个队列,而线程池就简化了这一流程,只需要将线程数量和队列当做参数输入就可以创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值