多线程
一、线程与进程
进程
1、执行中的程序
2、一个进程包含一个或多个线程
3、一个进程至少包含一个线程
线程
1、程序中单独顺序的控制流(流程)
2、线程本身依靠程序进行运行
3、线程是程序中的顺序控制流只能使用分配给程序的资源和环境
运行java程序的实质是启动java虚拟机进程也就是说Java程序运行的是一个java虚拟机进程。
线程是进程中可独立执行的最小的执行单元
同一进程中有多个线程
线程共享进程的资源(内存,空间,变量,方法)
单线程
程序中只存在一个主线程,实际上主方法(main)就是一个主线程
线程所要完成的计算被称为任务
多线程:
多线程是在一个程序中同时运行多个任务
多线程的目的是:更好的使用CPU资源,提高程序的计算效率
二、 创建线程
建状态(New):线程对象创建后,即进入新建状态
就绪状态(Runnable):当调用线程对象的start()方法,线程进入就绪状态。
处于就绪状态的线程,只是说明该线程已经做好了准备,随时等待CPU调度执行,并不是说执行了start()该线程就会执行
运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才开始执行,即进入运行状态。注意,就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态。直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为3种:
- 等待阻塞:运行状态中的线程执行wait()方法
- 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用)
- 其它阻塞:通过调用线程的sleep()、join()方法或发出I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或超时、或者I/O处理完毕时,线程重新转入就绪状态
死亡状态(Dead):线程执行完毕或者因异常退出了run()方法,该线程结束生命周期,线程销毁。
三、串行、并发、并行
1、串行
一个人,顺序的做多个任务,总耗时是多个任务耗时总和
a:1------>2----->3
2、并行
一个人,并发的做多个任务,即一个人先执行一个任务,在执行这个任务期间,有一段时间是空闲的,他利用这段时间去执行另外的任务,这样交替执行
a:1------>3----->
a:2------>
3、并发
多个人同时做多个任务总耗时取决于用时最长的任务
a:1-------->
b:2--------->
c:3------->