一、什么是进程?什么是线程
进程:进程是并发执行程序在执行过程中资源分配和管理的基本单位(资源分配的最小单位)。进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。每个进程都有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段。
线程:程序执行的最小单位。
为什么要有线程?
每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接收大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大响应用户请求效率低),因此操作系统中线程概念被引进。
线程的六个状态:
初始状态(NEW):一个尚未启动的线程所处的状态;
可运行状态(RUNNABLE):可运行线程的线程状态,可能正在运行,也可能在等待处理器资源;
阻塞状态之锁阻塞(BLOCKED):被阻塞等待监视器锁定的线程所处的状态(即当一个线程试图获取锁,但锁此时被其他线程持有,该线程进入BLOCKED状态,当线程拿到锁则进入RUNNABLE状态);
阻塞状态之无限等待(WAITING):未指定等待时间的线程所处的状态(调用Object.join()或Object.wait()方法时进入此状态,一个线程处于该状态时,只能被另一个线程唤醒,而不能自己主动唤醒,另一个线程调用notify()或notifyAll()或中止状态时来唤醒该线程);
阻塞状态之定时等待(TIMED_WAITING):指定等待时间的线程所处的状态(调用Thread.sleep(long)或Object.join(long)或Object.wait(long)方法时进入此状态,直到时间超时或收到唤醒通知,注意wait(0)时是可以自己苏醒的,比如当Thread结束时就会自动苏醒);
终止状态:已经执行完成的线程状态。
二、进程与线程的区别
地址空间: 同一进程的所有线程共享本进程的地址空间,而不同的进程之间的地址空间是独立的。
资源拥有: 同一进程的所有线程共享本进程的资源,如内存,CPU,IO等。进程之间的资源是独立的,无法共享。
执行过程:每一个进程可以说就是一个可执行的应用程序,每一个独立的进程都有一个程序执行的入口,顺序执行序列。但是线程不能够独立执行,必须依存在应用程序中,由程序的多线程控制机制进行控制。
健壮性: 因为同一进程的所以线程共享此线程的资源,因此当一个线程发生崩溃时,此进程也会发生崩溃。 但是各个进程之间的资源是独立的,因此当一个进程崩溃时,不会影响其他进程。因此进程比线程健壮。
线程执行开销小,但不利于资源的管理与保护。
进程的执行开销大,但可以进行资源的管理与保护。进程可以跨机器前移。
进程和线程的选择取决以下几点:
需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程的代价是很大的。
线程的切换速度快,所以在需要大量计算,切换频繁时使用线程,还有耗时的操作时用使用线程可提高应用程序的响应。
因为对CPU系统的效率使用上线程更占优势,所以可能要发展到多机分布的用进程,多核分布用线程。
并行操作时用线程,如C/S架构的服务器端并发线程响应用户的请求。
需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。