首先最直观的就是:一个进程可拥有多个线程。
- 具体比较:
- 调度
进程拥有资源;
线程是调度和分派的基本单位;
同一进程中线程的切换不会引起进程的切换;
进程间的线程切换则会引起进程切换从而导致资源切换等。 - 并发性
进程:进程和进程之间可并发执行 ;
线程:除了进程间的并发执行还可以线程之间并发执行;
线程的并发性更高。 - 拥有资源
线程并不能拥有资源,只有进程才拥有资源。 - 系统开销
进程创建、切换和撤销都会导致系统为之创建或者回收进程控制卡以及资源,但是线程的创建以及线程间的切换并不会引起系统做这些事儿,所以线程的系统开销明显更小。
- 调度
b.线程的调度
阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种;
- 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁);
- 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中;
- 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁);