开发者社区> 牧小农> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【多线程与高并发】从一则招聘信息进入多线程的世界

简介: 【多线程与高并发】从一则招聘信息进入多线程的世界
+关注继续查看

多线程的学习方法

多线程作为面试的重灾区,如果我们能够进行深入的了解和使用,对我们而言是非常有有益的,尤其是在面试的时候,如果多线程回答的好,是非常能够加分的。这样才能够经受住面试官的夺命连环问!


不管学什么,我们都需要有一个整体的认知,俯瞰其全貌,了解其细节,如果可以的话,最好是画一个思维导图,将其中的分支和一个个的小的知识点,记录上去,方便我们学习的时候,逐步有条理的分解性学习,从而达到从点到面,从面到体的过程。


多于多线程的学习,比较推荐的自然还是自己动手做小实验和了解理论基础,我们在时间充裕的情况下,可以看有关于多线程的书籍,比如(Java多线程编程核心技术、Java并发编程实战 (java并发的圣经)、多处理器编程的艺术)等等,但是对于时间不太充裕的同学,看书和自己动手实践的时间就会比较少,这个时候我们只能靠背、看面试题的方法去学习。


压榨CPU性能


在之前的时候,小农有看到一个面试要求,小农看到了觉得很有意思,就记录下来了,是什么呢?


Java基础扎实,熟悉JVM、多线程、集合等基础,熟悉分布式、缓存、消息、搜索等机制

三年以上Java开发经验,熟悉Spring、MyBatis等框架

对于压榨CPU性能有浓厚兴趣!

具有一定项目规划和决策能力,善于捕捉业务需求、系统架构设计中存在的问题,并给出有效的解决方案

具有高度领域设计能力和业务分析能力,能独立分析和解决问题

我们看到第三条,对CPU性能压榨有浓厚的兴趣,线程的历史,就是对电脑CPU压榨的一个历史,当我们的多线程越多效率越高,对于CPU的压榨也就越厉害,但是压榨的时候我们也需要注意,在压榨的同时,保证程序的正常运行也是我们需要考虑的一个点。


线程的历史


对于线程的历史,其实就是对于服务器的CPU进行不断的利用的升级过程。当我们学习一个新技术的时候,去了解这个技术的背景,可以更好的了解和掌握新技术,虽然这个过程看起来无用且浪费时间,但是在我们后面的学习过程,能够帮助我们更好的理解新技术。从线程的发展来看,可以分为五个阶段:


1、单进程


最早的就是单进程进行人工切换,那个时候的程序,一次就只能运行一个程序,当我们想要切换别的程序的时候,只能人工停止当前程序,再来运行别的程序,这个时候CPU利用率不高,很多时候是等着人工来进行干预,如下图所示:

image.png



2、批处理


慢慢的有人就觉得这种方式太慢了,或者太影响效率了,于是就有了多进程批处理,可以理解为,在我们进程里面,有ABCDF五个程序,我们可以一次性输出这五个程序,不用再他们之间在进行切换,但是如果程序A阻塞了,那么其他四个程序就需要进行等待,如下图所示:


image.png


3、并行处理


把程序写在不同的内存位置上来回切换,比如我们有ABC三个程序,程序A去CPU进行运算,但是由于网络的延迟或者什么原因,导致程序A阻塞了,那么这个时候程序B就可以去CPU里面去执行,如果程序B也阻塞了,那么程序C就可以去CPU里面执行

image.png



4、多线程


程序内部可以有不同的任务进行来回的线程切换,比如说我们使用的IDEA,它内部可能有的在等待网络的传输,有的在进行代码的展示,有的在进行save,将我们的代码保存在历史记录等等,这些个任务他们执行的时候也是并行的执行的,这个时候就产生了线程的概念,线程是属于一个进程里面并行执行的这样的不同的路线,一个程序不同任务的切换,一个线程如果要提升他的效率的,内部其实是非常复杂的。其中设计到网络和IO的知识。


5、纤程/协程


是一种最轻量化的线程,一种绿色的线程,它也是一种用户线程,就是有用户自己管理,不再由计算机去管理,

让应用程序可以独立决定自己的线程要如何运作。操作系统内核不能看见它,也不会为它进行调度,纤程有自己的寻址空间。应用程序可以在一个线程环境中创建多个纤程,然后手动运行它。纤程不会被自动运行,必须要由应用程序自已指定让它运行,或换到下一个纤程。


进程/线程/纤程


1、什么是进程


进程就是说在系统中正在运行的应用程序,程序一旦运行就是进程,比如我们常用的QQ,WeChat等等,进程是系统进行资源分配的独立实体,每个进程都有自己独立的地址空间,一个进程可以有多个线程,每个线程使用自己所属进程的栈空间。


// 进程:是操作系统资源分配的基本单位,比如内存、打开文件、网络IO,分配了独立的内存空间
public class T00_Process {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}


image.png




2、什么是线程


线程是程序执行的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,通常也被称为轻量进程。


单线程:

image.png

单线程下,不同的执行路径


多线程:


image.png

3、什么是纤程


纤程(Fiber)包含独立的目态栈,寄存器状态的控制信息,目态控制的纤程转接要求较高的编程经验,由于纤程属于目态对象,一个纤程被封锁意味着所在线程被封锁,应用程序可以通过ConvertThreadToFiber将线程转换为纤程,与线程对比,纤程具有切换速度快的特点。


纤程具有的特征


线程是在Windows内核中实现的,操作系统会根据系统的调度算法对线程进行调度。

纤程是在用户模式下实现的,内核对纤程一无所知。

纤程是更轻量级的线程,一个线程可以包含一个或多个纤程

什么是线程的切换


什么是线程的上下文切换?:

多线程的上下文切换是指 CPU 控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取 CPU 执行权的线程的过程。


单核CPU设定多线程是否有意义


通常一个任务不光 cpu 上要花时间, io 上也要花时间(例如去数据库查数据,去抓网页,读写文件等)。 一个进程在等 io 的时候, cpu 是闲置的,另一个进程正好可以利用 cpu 进行计算。 多几个进程一起跑,可以把 io 和 cpu 都跑满了。

现在一般都是虚拟资源,资源有弹缩机制,所以一般该跑多线程的时候就可以跑多线程。


工作线程数是不是设置的越大越好


当然不是,线程的切换也是需要消耗资源的,越多意味着线程来回之间的切换。


我是牧小农,怕什么真理无穷进一步有进一步的欢喜,大家加油


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
基础设施无边界:企业如何在多云世界中重新考虑IT
如今, 多云承诺的未来与企业IT当前的现实背道而驰。这意味着需要改变的不仅仅是对当前体系结构和运营实践的增量式延续。实际上,企业的业务需要进行整体规划,因为它们不仅将应用转移到云端,而且还要为多云做好准备。
53 0
Confluence 6 查看系统信息
系统信息界面提供了有关 Confluence 的配置信息和 Confluence 部署的环境信息。 希望对你的系统信息进行查看: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接。
823 0
月销涨3倍:阿里巴巴零售通联合饿了么宣布将赋能近万天猫小店
7月5日,阿里巴巴零售通和饿了么宣布战略合作计划:双方将对遍布全国的天猫小店进行联合运营赋能,零售通帮他们更便宜进货、更科学管理店铺,饿了么为其提供线上销售平台,蜂鸟配送提供24小时本地即时配送服务。
1295 0
"AI+"进入科学界:人工智能将主导原子世界的科学发现进程
AI是一门科学,现在,它也在变革科学,甚至于它所展现的能力,已经不仅仅是变革科学发现的潜力,而是主导科学发现的进程,成就科学领域进入新一次的大爆发阶段。
3240 0
blktrace工具源码
1.1.1 关于blktrace 我们知道,在iostat工具中,await表示单个I/O所需的平均时间,但它同时包含了I/O Scheduler所消耗的时间和硬件所消耗的时间,所以不能作为硬件性能的指标,至于iostat的svctm更是一个废弃的指标。
2520 0
[React Native]访问操作系统剪贴板 Clipboard
我们之前学习了TextInput组件, 有时候我们需要在TextInput组件中复制或者粘贴一些文字。 React Native为开发者提供了 Clipboard API,Clipboard 组件可以在iOS和Android的剪贴板中读写内容。目前还只支持获取或者存放字符串。 主要方法 static getString() 获取剪贴板的文本内容,返回一个Promi
1174 0
Android重写onConfigurationChanged规避横竖屏切换时候重新进入onCreate生命周期
 Android重写onConfigurationChanged规避横竖屏切换时候重新进入onCreate生命周期 Android系统内在的机制,当activity在横竖屏切换时候,会强制重新开始进入activity的生命周期onCreate,在有些特殊的场景,开发者不希望重新进入onCreate生命周期,那么,可以通过重写Android的onConfigurationChanged规避。
869 0
『摄影欣赏』20幅世界各地的精美河流摄影照片【组图】
  河流的自然水源通常来自雪山顶上,遍历高山、丘陵、平原等地貌特征之后最终汇入大海。蜿蜒河流可能流经一个或多个国家的不同地区,打破自然的障碍向前流淌。河流通过许多障碍的地方都是一个很好的摄影的主题。河的外观变化随着季节的变化,从而为摄影师提供大量的主题捕捉。
859 0
+关注
牧小农
业精于勤荒于嬉,行成于思毁于随。
134
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载