进程、线程、多线程
-
进程:程序的执行过程,例如
QQ.exe
,Music.exe
等程序的集合。- 一个进程可以包含多个线程,但至少包含一个线程
- 进程是资源分配的基本单位
java
默认有两个线程,分别是main线程(即主线程)和GC
(垃圾回收)
-
线程:线程是进程中执行运算的最小单元,以
QQ
为例,QQ.exe
是一个进程,在聊天框中,我们可以一边接收文件(线程1),一边打字聊天(线程2)。再以Music
为例,Music.exe
是一个进程,在听音乐的时候(线程A),我们可以下载音乐(线程B)-
一个线程只能属于一个进程
-
线程是处理机调度的基本单位
-
同一个进程中的所有线程共享该进程分配到的所有资源
-
-
多线程:学习多线程之前,需要先了解
并行
和并发
的区别并行:同一时间同时执行,强调同一时刻—>你打游戏和你女朋友打你同时进行
并发:同一时间段多个任务轮流执行,强调一段时间—>你打完游戏后去哄你女朋友,然后可能还会接着打游戏或者去做别的事
- 当程序中有两个子系统需要并发执行,这个时候就需要利用多线程—>不仅需要打游戏,还需要哄女朋友
- 切记,上下文的切换开销也很重要,CPU切换线程时会产生开销,所以不宜创建太多的线程,否则CPU花费在上下文切换的时间将多于执行程序的时间。(进程/线程上下文切换会用掉你多少CPU)
-
线程池:管理线程的池子,可以控制线程的数量,当任务到达了,先判断线程池中是否还有空闲的线程,如果有,直接取该线程;如果没有,则需要等待,直到其余某个任务结束,释放线程给他。—>卫生间有十个蹲位,你去上厕所先看是否有空闲蹲位,如果有,占用一个蹲位;如果没有,那就得等待,直到有人结束了,把蹲位空闲出来。
- 线程池帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程也是一个对象,创建一个对象需要经过类的加载过程;销毁一个对象,需要走
GC
垃圾回收流程,都需要资源开销。 - 线程池提高了响应速度,直接从线程池中拿线程要比重新创建一条线程快得多。
- 重复利用,线程用完再放回池子里,可以重复利用,节省资源。
- 线程池帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程也是一个对象,创建一个对象需要经过类的加载过程;销毁一个对象,需要走
-
线程的创建:三种方式
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口