什么是进程?
我们都知道一个程序运行最少需要一个进程,进程就是程序执行时的一个实例,每个进程都有自己独立的内存地址,它是系统分配资源的基本单位..
在什么情况下使用进程?
一个请求需要更稳定、更安全时,我们会优先考虑用进程
还有就是在一些弱相关的处理时会用进程
因为强相关的处理肯定会涉及到大量的通讯等我们去创建、销毁一个进程代价很大,需要不停的分配资源每个进程
然而每个进程又都有自己独立的内存地址,
如果我们为每个请求都创建一个进程
系统开销大,请求响应的效率也会较低
因此在这种情况下操作系统引进了线程
那什么是线程呢?
线程是进程中的一个实体,进程的一个执行路径
是CPU调度和分派执行的基本单位
线程本身是不会独立存在的
系统不会为线程分配内存,每个线程有自己的栈资源,用于存储该线程的局部变量,其它线程是无权访问的。
每一个线程都是进程的一个执行路径,所以线程之间可以共享所属进程的资源
线程和进程之间有什么关系?
一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进程的资源。
Java 中当我们启动 main 函数时候就启动了一个 JVM 的进程,而 main 函数所在线程就是这个进程中的一个线程,也叫做主线程。
一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和自己的栈区域。
线程和进程的区别是什么?
本质:进程是操作系统资源分配的基本单位;线程是任务调度和执行的基本单位
还有从执行过程,维护性.资源分配和通信都有区别..
包括线程和进程的健壮性也是不同的 就是存活性 :
(1)进程具有独立的空间地址,一个进程崩溃后,在保护模式下不会对其它进程产生影响。
(2)线程只是一个进程的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
什么情况下使用线程?
①需要频繁创建销毁的优先用线程(线程创建销毁开销小,过程简单,速度快);
②需要进行大量计算的优先使用线程(计算量大意味着要耗费大量CPU资源,必然需要频繁切换,多线程适合);
③强相关的处理用线程,
弱相关的处理用进程(强相关必然有更多相互通信,多线程通信简单,所以适合);
线程的优缺点?
优点:
流程简单
线程间方便的通信机制,同一进程下的线程共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;
缺点:
线程类已经继承了Thread类,所以不能再继承其他父类,对程序扩展性会受到约束。
线程过多会消耗大量的系统资源,线程的生命周期是不可控的,也会有内存泄漏的风险
当线程过多的时候会造成资源消耗,我们可以引入线程池来降低线程的资源消耗,提高响应速度,提高线程的可管理性
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。
新建:就是刚使用new方法,new出来的线程;
就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;
网友评论