Java并发编程的艺术(四)——进程与线程
进程(process)是操作系统启动的一个程序,是操作系统资源分配的最小单元,一个进程可以包含多个线程
线程(thread)是的CPU调度的最小单元
线程的状态(6种):
- new:创造实例初始化,但未进行start()方法的调用,所以此时的线程还没到就绪态
- runnable:就绪和运行态统称为“运行”
- waiting:需要等待其他线程做出一些特定的动作(通知或者中断)
- timed—waiting:超时等待,可以设置超时时间,即在超过指定的时间后自行返回
- blocked: 因为线程还未获取到锁而处于阻塞状态
- terminated:终止,此时线程已经执行完毕
初始化:
通过继承Thread或者实现Runnable接口可以获取到一个线程类,然后通过new构建一个线程实例
构建完成后并不是立即运行,通过调用start()方法进入就绪态,等待线程调度程序挑选
系统调度:线程调度程序会根据线程执行所需时间进行系统调度,避免一个只要执行一分钟的线程排在两小时线程之后从而导致该线程等待时间过长的情况发生,yield方法可以理解为给其他线程让步,从而提高系统运行效率
等待:
使用wait()和join()来可以使线程按照研发人员想要的顺序进行执行
通过notify()或者notifyAll()来使得相应的线程从等待状态回到就绪态
超时等待:
在等待的基础上设置超时时间,这样该线程不会一直等待下去,一旦时间达到超时时间则会自动返回。
阻塞:
一般存在于线程进入同步代码块或者同步方法之前,进入之前需要排队从而阻塞,一旦进入代码块后则意味着线程获取到了锁,回到了就绪态等待运行。
终止:
该线程完成了相应的任务,运行完毕后资源被回收