多线程
一、概念
1、程序、进程、线程区别与联系
1.1 程序:
程序是死的,静态的,是一些代码和数据经过编译后的二进制指令。一般对应于操作系统中的一个可执行文件,比如windows系统的exe文件,linux系统的elf文件
1.2 进程:
进程是执行中的程序,是活的,她执行着程序中的一个一个指令。每个进程都是一个程序经历创建,运行和销毁的过程。
进程特点:
-
一个进程有独立的虚拟内存空间,映射到特定的物理内存空间。各个进程间不会相互干扰。
-
一个进程在内存空间中分区: 有栈区、堆区、代码区和数据区等等
-
操作系统何以同时运行多个进程,通过一定的调度算法使进程以为只有自己在独占cpu时间
1.3 线程
进程可以产生多个线程。同一进程的多个线程也可以共享此进程的某些资源(比如:代码、数据)。
线程特点:
-
一个进程内的多个线程可以并发运行
-
一个进程中的多个线程共享相同的内存单元/内存地址空间,可以访问相同的变量和对象,而且它们从同一堆中分配对象并进行通信、数据交换和同步操作。所以线程间进信息交换更容易、更快。
-
线程的启动、中断、消亡,消耗的资源非常少。
1.4 线程和进程的区别
-
线程切换开销小,进程切换开销大,因为每个进程间都有独立的代码和数据,而线程间共用。
-
线程和进程最根本的区别在于:进程是资源分配的单位,线程是调度和执行的单位。
-
多线程指在同一应用程序中有多个顺序流同时执行;
多进程指在操作系统中能同时运行多个任务(程序);
1.5多线程并行取决于核心数
多线程,多进程是并行还是并发取决于你的CPU核心数量。 如果是单核CPU,多线程也没用。 如果是多核心CPU,那么就可以并行了。 CPU多一个核心,这个多出来的核心就可以多处理一个线程。 异步对应的概念是同步。 多线程是实现异步的方法。 多线程并行(同时进行)(这属于异步)依赖于多核心。
如果只有单核,那多线程也只能并发,看起来像同时运行而已。
查看本电脑核心数:
实际上是6核12线程。但这里显示的是12个核。
六核十二线程的意思是有6个物理核心,每个核心又各自进行双线程计算,既是被系统理解成12个核心。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fdnSZvnM-1665213776430)(D:\学习资料\笔记\java多线程\image-20220912130502966.png)]
2、并发、并行、同步、异步
并行:多个任务在同一时刻,在不同的处理器或核上同时执行,并行的必要条件是多处理器或者多核。
必须是两个及以上个任务在同时执行,必须是同时,没有时间上的先后顺序。
并发:是指多个任务同时在执行,分为并行并发和分时并发。
这里的“同时”对于并行并发来说是指同一时刻,是一个时间点。(真正同时)
而对于分时并发来说,是指一小段时间,是时间段,是通过处理器在这个时间段内不断的切换任务来实现的,由于时间段很短,所以给人一种任务同时执行的效果。(看起来同时)
例如:
食堂打饭,20个窗口同时给学生开放打饭,20个学生能同时在20个窗口打完饭。这叫并行并发
食堂吃饭,有菜,有米饭,有汤,你一会吃米饭,一会吃菜,一会喝汤,最后都吃完了。虽然看起来米饭,菜,汤你是同时吃的,但实际上还是一小段时间吃一样,不断切换,才看起来像同时。这叫分时并发。
上面的人就相当于处理器,抽烟喝酒烫头等于 3 个任务。
***异步:***在并发环境中,各任务各自独立执行,相互之间互不干扰。
***同步:***是指在并发执行的环境中,各个任务可以有序的执行,括括对于资源的共享或者互斥的访问。