进程和线程
进程(Process)是程序执行时的一个实例,是系统进行资源分配和调度的基本单位。进程由程序段、数据段和进程控制块组成。
线程(Threads)是进程内的一个执行实体,是CPU调度和分派的基本单位。一个进程可以有一个或多个线程,同一进程内的线程共享进程的数据和地址空间,每个线程有自己的堆栈和局部变量。
进程和线程的区别
-
进程是资源分配的基本单位,线程是程序执行的基本单位。
-
线程在调度和切换时比进程快得多。
- 进程间通信方式:管道、消息队列、信号量、共享内存、套接字。线程间通信的目的是线程同步,包括互斥锁、临界区、信号量。
并发和并行
-
并发:抢占CPU时间片,多个进程被快速的轮换执行,但同一时刻只有一个进程被执行。
-
并行:不抢占CPU资源,多个进程在多个CPU被同时执行。
线程状态
-
新建(New):创建一个线程对象。
-
就绪(Runnable):线程对象创建后,其它线程调用了该对象的start()方法。就绪状态的线程位于可执行线程池中,等待获取CPU时间片。
-
运行(Running):就绪状态的线程获取到了CPU时间片,执行程序代码。
-
阻塞(Blocked):运行状态的线程由于某种原因放弃了CPU资源,临时中止执行。线程阻塞结束,进入就绪状态。
-
死亡(Dead):线程运行结束或者因异常终止。
阻塞的三种情况:
(1)等待阻塞:运行状态的线程调用wait()方法,JVM会把该线程放入等待池中。
(2)同步阻塞:运行状态的线程在获取对象的同步锁时,该同步锁被别的线程占用,JVM会把该线程放入锁池中。
(3)其它阻塞:运行状态的线程调用sleep()或join()方法,或者发出了I/O请求,JVM会把该线程置为阻塞状态。