目录
一、多线程基础思维导图
下边是本人在多线程基础学习中,对学习知识的总结。以思维导图的方式,展示给大家。
二、多线程基础要掌握的问题
经过上边的思维导图的展示,相信大家一定对多线程的基础有了详细的了解,下边总结一下在多线程基础模块中容易混淆的几个问题
1.什么是线程,什么是进程?两者的区别是什么?
官方的讲:进程是系统分配资源的最小单位,线程是系统调度的最小单位。官方的话往往很难理解,下边用一个例子来表示线程和进程。>
(1)进程
(1)进程在内存中就是
正在运行的一个可执行程序
,要进行这个程序的运行系统就要分配响应的内存空间。系统在分配资源的时候,为了保证资源最大化利用
,它会分配一个刚好够程序中自己能正常运行的空间大小
。这也就对应了,进程是系统分配资源的最小单位。(2)形象理解:把CPU当做成一个工厂,一个工厂是有
好多车间构成的。组成整个工厂的每一个车间就对应CPU中不同的进程。由于工厂的面积是要花费金钱的(地皮很贵的)。在创建工厂时,就想着能不能很好的利用现有的占地面积,给每一个工厂刚好分配能够他们生产的空间,这就对应了进程中的“系统分配资源最小单位
”
(2)线程
(1)首先线程是在进程的基础上引入的,所以
线程是在进程中包含的
。
(2)形象理解:还是工厂的例子,进程对应工厂中的每一个车间,线程就对应的是车间中的每一个员工。可以看出员工是在车间中包含的。在员工工作的时候,和我们平时的工厂工作方式不太一样。平时是各干各的事情,相互不影响。但是在计算机中,员工在干事情的时候要绝对听从计算机的指挥。计算机在命令车间中员工做事的时候,一次只能命令一个
。但是 由于每一个员工做事的时间非常短,CPU会通过不停调度(时间片轮转,后边会讲到),保证这些任务看起来同时执行
。在CPU的角度看做事情分先后顺序的,一个执行完再执行另一个的,但是在人的视觉下根本感受不到,所以认为是同时执行的(并发和并行后边讲到)。
(3)线程能共享进程中的资源:这点很好理解,在一个车间中,整个车间的地方大家是能同时用到的。
(3)图片说明进程和线程:
(3)进程和线程的区别
经过上边的讲解,相信大家已经大致了解进程和线程的区别,下边来简单的总结:
(1)进程和线程是包含关系,进程包含线程。线程可以共享进程中的资源。
(2)一个进程中可以包含多个线程,并且一个进程中至少包含一个线程。
(3)进程是系统分配资源的最小单位,线程是CPU调度的最小单位【这两句话一定要结合上边的例子理解,别硬背哈~】
(4)进程是要CUP划分资源的,线程不要,因为线程就在进程里边
(5)由于进程间是互不相连的,所以一个进程垮掉之后,不会对其他进程造成影响。但是线程由于是共享资源,一个进程挂掉之后,往往会对其他进程造成影响。
2.为什么要引入多线程,它的引入解决了什么问题,又带来了什么问题?
(1)多线程的引入
(1)为了能够
提高代码的执行效率,充分利用CPU资源
。引入了多线程。
(2)形象理解:现在我们要造一辆汽车。一种方法是一个人从前期设计到造轮胎、发动机、引擎、内饰、到最后的检测全部有这个人来完成,显然这样的工作效率太低,没有充分的利用其它人的资源。我们解决的方法就是,让好多人去分别造汽车的每一个模块,这些模块之间不影响,这样的操作既能更好的利用工厂和车间的其他空余资源,又能提升开发效率。
(3)多线程就是,为了同时执行不会相互影响的代码,进而提高程序执行效率。
(2)解决的问题
1)能够把占据时间长的程序放在后台去执行。
2)可能提高程序的执行效率
(受任务量、系统资源、线程个数三者共同影响)
(3)带来的问题
1)牵扯到多线程,就牵扯到多个线程对共享资源的操作问题。势必就会带来
线程安全问题。
2)可能会拖慢程序执行效率
:多线程时为了提高效率的,但是线程的创建是需要时间的,线程的创建也占据系统资源的。要是线程里边进行的操作时间远小于线程创建时间,那么就会拖慢程序运行效率。举个例子:你开车去50公里外的加油站加了10块钱的油,这不扯蛋呢吗?
3.线程和进程的几种状态。
(1)进程的状态
进程的状态有三种(三态模型):
1)阻塞态:表示进程在阻塞等待某个事件的完成。
2)就绪态:进程在准备运行时需要系统分配处理器,此时是在等待系统分配处理器。
3)运行态:系统已经分配好处理器,现在分配好的处理器正在运行。
(2)线程的状态
先看一下线程的状态转换图:
1)
初始态(NEW)
:就是创建了一个线程,线程的初始化。
2)可运行态(RUNNABLE)
:Javah中是否运行一个线程是由CPU调度决定的。上边的线程创建好之后,要是系统CPU没有命令你运行,叫就绪态;要是CPU命令你执行的时候就是运行态。Java中将运行态和就绪态合成为可运行态。
3)等待态(WAITING)
:CPU 没有分配你运行时间的时候,你就等待。要等待显示唤醒,要是没有唤醒,则无终止等待下去。
4)超时等待态(TIMED_WAITING)
:CPU没有分配你时间时等待,不用显示唤醒,只要等待到一定时间会自己唤醒。
5)阻塞状态(BLOCKED)
:表示线程阻塞在进入synchronized修饰的方法的状态。
6)终止状态(TERMINATED)
:要是run()方法完成时或者main线程完成时,就认为线程终止了。线程终止将不能复生。
4.创建线程的方法有哪些?
(1)创建线程的三种方法
创建线程的方法有三种:
(1)继承Thread类
:直接继承java.lang.Thread类,重写run()方法。
(2)实现Runable接口
:实现java.lang.Runnable接口,重写Runable()方法。
(3)实现Callable接口
:实现Callable接口。重写Call()方法。
(2)进一步:Ruunable和Callable的区别是什么?
(1)相同点:
1)两者都是接口。
2)两者都是进行线程创建的一种途径。
3)两者创建的线程都是以 .start()来启动的。
(2)不同点:
1)一个是要重写run()方法,一个是要重写call()方法。
2)runnable没有返回值,callable有返回值。
3)runnable只能抛运行时异常,不能捕获异常;callable允许抛异常,能捕获异常。
5.用户线程和守护线程的区别。
(1)用户线程
可以理解为:
工作在前台的线程
,体现为一个任务的提交,要进行的真正的实际操作。就是要完成真正程序代码的线程
,如程序运行时的主线程。
(2)守护线程
理解为:
后台运行的线程
,没有进行真正的任务的完成,只是做一些善后的工作
。如在主线程启动之后,Java虚拟机也会创建,里边的JIT线程,GC线程这些做善后工作的都是守护线程。
(3)注意点
1)
守护线程是依赖于用户线程的
。守护线程就是为用户线程处理善后工作的。
2)用户线程一旦退出
,守护线程也就失去了自己的意义,此时守护线程会自动退出
。
3)在守护线程中产生的新的线程也叫做守护线程
。
6.关于多线程基础API的问题:
(1)说一下Run()和start()的区别?
1)
start()方法是用来启动一个线程的
,线程里边的具体任务执行与否还不能控制。run()方法是用来执行已经启动的线程的具体代码任务
。
2)start()方法只能调用一次,run()方法可以多次调用。
(2)说一下wait()和sleep()的区别?
1)
所在类不同:
sleep()来自于Thread类,wait来自Object类
2)是否唤醒:
sleep()在等待时间够了之后会自动唤醒,wait()要进行方法调用来唤醒线程。
3)是否释放锁:
sleep()不用释放锁,wait()要释放锁。
(3)yield()方法是用来干啥的?
此方法为了让线程让步
:就是让当前的正在运行的线程从运行态转变为就绪态,等待CPU进行时间片轮转切换到它上边时再进行运行。
7.如何中断一个线程?interrupt()、interrupted()、isInterrupted()三者的区别。
(1)线程如何终止
1)run()方法跑完之后,当前线程就会终止。
2)调用stop()方法直接终止。
3)通过调用interrupt改变中断标志位来进行终止。(这了调用此方法,只是把中断标志位从false 改变为 true了,并没有中断线程,至于是否中断是有程序代码自己去实现的)
(2)interrupt()、interrupted()、isInterrupted()三者的区别
1)interrupt 和isInterrupted都是实例方法,interrupted是静态方法。
2)interrupt方法只是改变了中断标志位,只是通知了一下,并没有真的中断,真正的中断由代码自行决定。
3)interrupted是判断线程是否中断的
。在调用的时候,处于等待状态下的线程会议抛异常的方式中断掉。在中断之后会重置中断标志位。
4)isInterrupted也是判断线程是否中断的
。在调用的时候不会重置中断标志位。
8.对线程优先级的理解。
在Java中对线程的
优先级是可以进行设置的
。但是在线程具体执行的时候是否按我们代码中规定的优先级进行就说不定了。必定在多线程执行时, 哪个线程先运行哪个线程后运行是有CPU调度的 ,就是等待属于自己时间片轮转时间的到来。
9.并发和并行的区别。
(1)并发
意思是:
多个任务在一个CUP在执行
。可以这样理解,现在有多个任务,单核CUP在处理这些任务的时候,是不停的在切换的,具体就是时间片的轮转。站在CPU的角度来看:并发还是一个一个任务依次执行的。但是站在人的视觉感官下看,因为CPU在时间片轮转调度的时候,分配给每一个任务的时间非常短,人根本感觉不到,所以认为是同步执行任务的。因此并发叫做“假同步”
(2)并行
并行指的是
同时执行多个任务。
这里的同时指的是真正意义上的同步,是有多和CPU或者过个处理器来执行多个任务的。不管是站在CPU的角度看还是站在人感官的角度看都是同步执行的。因此并行也被叫做“真同步”