序
不知道大家有没有这样的面试经历:
面试官:了解多线程吗?
答:这个不太了解
面试官:
多线程大家在初学的时候,对这个知识点应该有不少的疑惑的。我认为主要原因有两个:
多线程在初学的时候不太好学,并且一般写项目的时候也很少用得上(至少在初学阶段时写的项目基本不需要自己创建线程)。
多线程的知识点在面试经常考,多线程所涉及的知识点非常多,难度也不低。
这就会给人带来一种感觉「这破玩意涉及的东西是真的广,平时也不怎么用,怎么面试就偏偏爱问这个鬼东西」
多线程的知识,由于在项目中实际使用场景很多,在此记录一下。
为什么使用多线程?
首先,我们要明确的是「为什么要使用多线程」,可能有人会认为「使用多线程就是为了加快程序运行的速度啊」。如果你是这样回答了,那面试官可能会问你「那多线程是怎么加快程序运行速度的?」
于我的理解:使用多线程最主要的原因是提高系统的资源利用率。
现在CPU基本都是多核的,如果你只用单线程,那就是只用到了一个核心,其他的核心就相当于空闲在那里了。我们要做的应该是充分发挥计算机多核CPU的优势,将串行的任务改为并行执行,提高执行效率。
多线程有哪些具体的业务场景?
经典场景:
火车站多个窗口卖票。参见:
https://blog.youkuaiyun.com/tomcat_2014/article/details/60575942
多线程离我们远吗?
其实在我们的日常开发中,也有很多的业务场景可以使用到多线程:
1、用户注册完成送大礼包/积分之类,且积分等也是另一个系统并比较耗时;且这类任务即使失败也不是特别重要的。
2、后台线程:比如定期执行一些特殊任务,如定期更新配置文件,任务调度(如quartz),一些监控用于定期信息采集等,笔者在这里也会分享后台的多线程定时任务。
3.Tomcat我相信每个Java后端的同学都认识它,它就是以多线程去响应请求的,我们可以在server.xml中配置连接池的配置,比如:
<Connector port="8080" maxThreads="350" maxHttpHeaderSize="8192" minSpareThreads="45" maxPostSize="512000" protocol="HTTP/1.1" enableLookups="false" redirectPort="8443" acceptCount="200" keepAliveTimeout="15000" maxKeepAliveRequests="-1" maxConnections="25000" connectionTimeout="15000" disableUploadTimeout="false" useBodyEncodingForURI="true" URIEncoding="UTF-8" />
Tomcat处理每一个请求都会从线程连接池里边用一个线程去处理,这显然是多线程的操作。只是框架屏蔽了底层的细节访问。
还有我们在连接数据库的时候,也会用对应的连接池(Druid、C3P0、DBCP等),比如常见的Druid配置。
从上面总结下来,我们可以发现:我们日常「关于多线程的代码」写得不多,但是我们写的程序代码的的确确是在多线程的环境下跑的。
如果我们不懂多线程知识,很直接的一个现实:
虽然在工作中未必会全部用得上,但如果项目真的用到了,我们如果学过了可能就可以很