进程与线程的概念
进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。
线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的线程共享进程的资源。
(3)进程是CPU,内存等资源占用的基本单位,线程是不能独立占有这些资源的;
(2)进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信方便;
(4)进程在执行过程中,包含固定的入口,执行顺序和出口,而进程的这些过程会被应用程序控制。
进程所拥有的资源包括地址空间,全局变量,打开文件,子进程,即将发生警报,信号与信号处理程序,账户信号,同步,互斥信号量
线程所拥有的资源包括程序计数器,寄存器,堆栈,状态。
具体共享资源分配如下图:
堆内存以及方法区属于进程,栈内存为线程私有。
并发与并行
并发:同一时段内多个任务同时都在执行,并且都没有执行结束。
并行:单位时间多个任务同时执行。‘
并发任务强调在一个时间段内同时执行,而一个时间段有多个时间单位积累而成,所以并行是并发的某一时刻状态。
线程的创建与运行
(1)实现Runnable接口
(2)继承Thread类(缺点是Java不支持多继承,优点:方便调用Thread类的方法)
(3)使用FutureTask(可以得到任务的返回值)
上下文切换
把当前任务(A进程)的状态保存下来,再加载下一任务(B进程)的状态后,继续服务下一任务。任务的状态保存及再加载的过程叫做上下文切换。
死锁产生的条件与预防
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
(1)互斥
(2)请求并持有
(3)不可剥夺
(4)环路等待
由于互斥和不可剥夺条件无法被打破,所以只能从请求并持有和环路等待两个方面来预防死锁。最常见的方法有锁超时,或者利用拓扑排序来分配资源,保证不会产生环路等待。
守护线程与用户线程
守护线程:当JVM中只剩下守护进程时,虚拟机会退出,即程序终止。
用户线程:只要有用户进程,虚拟机就不会退出。