什么是多线程?
一个程序(一个进程)运行过程中产生了不止一个线程。
一个生产汽车的车间好比一个进程,这个车间里的每个人分工合作,各自做自己的任务,每个工人好比一个线程,多个人同时工作则是多线程作业。
一个工人就是一个线程。
并行(parallel):多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发(concurrent):通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。
为什么需要多线程编程(并发编程)?
- 提高多核cpu利用率,并行执行任务,增加吞吐量。
线程的生命周期
日常开发中需要了解并发编程吗
以下是几个实际开发场景:
-
一个界面由文字,图片和视频组成,如果由单线程加载页面,先加载文字,再加载图片,再加载视频,由于这三个任务是排队执行,最终响应的时间>=三个任务的总和。如果使用三个线程并行加载不同的部分,可以大大提高界面的加载速度。
-
假设由你来设计一个web服务器,如果这是一个单线程的服务器,当接收到多个请求时只能排队挨个执行,响应时间和吞吐量都十分低下,cpu利用率非常低。目前市面上的web服务器都是多线程的,内部维护一个线程池,依据配置好的线程数来创建多线程响应多个请求,提高服务器的响应速度和吞吐量。
那么我做的功能不需要多线程,我可以忽略吗?
即使我们不编写多线程相关代码,往往使用的各种web开发框架也会把多线程引入到我们的程序中,例如servlet和web框架的Controller层,我们在编写业务代码时并没有显式创建线程,可是最终还是会被框架以多线程的方式进行调用,如果不了解一些并发编程的相关知识,可能会导致一段看起来十分正确的代码在多线程环境中运行出现不可预测的结果。