线程的生命周期
- 新建状态(New)
创建了一个线程对象; - 就绪状态(Runnable)
线程创建对象后,其他线程调用了该对象的Start()方法,改状态的线程位于可运行线程池中,变得可运行,获取CPU的使用权 ; - 运行状态(Running)
就绪状态的线程获取了CPU,执行程序代码; - 阻塞状态(Blocked)
阻塞状态是线程因为某种原因放弃了CPU的使用权,暂时停止运行,直到线程进入就绪状态,才有机会转到运行状态;
阻塞状态分三种
(1)等待阻塞: 运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入等待池中.
(2)同步阻塞: 运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,JVM会把该线程放入锁池中.
(3)其他阻塞: 运行的线程执行sleep()或者join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态 - 死亡状态(Dead)
线程执行完了或因异常退出了run()方法,该线程结束生命周期;
start()和run()区别
start()会执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作,而直接执行run()方法,会把run()方法当作一个main线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作.