进程,就是正在运行的程序,如.exe。每个进程都有自己的存储空间。
线程,就是操作系统的最小调度单位。一个进程可以有很多个线程。进程中的线程共享进程的内存。
理论上,一个进程可以有很多线程,每条线程并行执行不同的任务。
串行
如排队一样,每次处理一个线程。
并发
多个线程时,如果系统只有一个处理机(CPU),他不可能同时进行一个以上的线程,必须将CPU运行时间进行划分,将时间段分配给每一个线程。
并发量,一段时间内处理的请求数量。
并行
同一个时间点能够处理的程序个数。并行是指“并排行走”或“同时实行或实施”。
在操作系统中是指,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。
线程的生命周期:
线程的生命周期包含6个阶段:
包括:创建、运行、等待,超时等待,阻塞、死亡。
以下为个人理解以及归纳:
-
创建(New):
-
就是刚使用new方法,new出来的线程;
比如刚开始的 new Thread();
-
就绪(可运行):就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
被调用start()方法后, 进入到Runnable();
-
运行(Runnable):
-
当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
-
等待(Waiting):
Waiting 状态的进入有三种情况,如上图中所示,分别为:
- 当线程中调用了没有设置 Timeout 参数的 Object.wait() 方法
- 当线程调用了没有设置 Timeout 参数的 Thread.join() 方法
- 当线程调用了 LockSupport.park() 方法
进入等待状态后的线程无法自己主动的进入到运行状态,它必须借助另外一个线程将它唤醒。
比如A线程进入waiting状态,不能主动地进入到运行状态,必须要借助B线程来将A线程唤醒,否则A不能运行。
-
阻塞(Blocked):
-
在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态。
-
当线程进入到 synchronized 代码块中未能获得相应的 monitor 锁,则会由运行状态→等待状态。当线程获得 monitor 锁,此时线程就会进入 Runnable 状态中参与 CPU 资源的抢夺。
等待与阻塞的区别:比如吃饭时,在排队的是“阻塞”,前面有人,但会轮到它;而根本没有排队的是“等待”,就算有饭菜、前面没有人排队它也打不到。
-
超时等待(Timed Waiting):
与sleep很像,一旦等待时间到了,它是能够进入运行状态的。或者被 notify(),提前唤醒。
-
销毁(Terminated):
-
如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源,即:
- run() 方法执行完毕,线程正常退出。
- 出现一个没有捕获的异常,终止了 run() 方法,最终导致意外终止。