新建
当一个线程被创建的时候,线程处于新建状态
就绪
调用线程的start()方法,可以让该线程处于就绪状态,此时的线程并没有真正的运行
注意:如果调用线程的run()方法,就相当于调用对象的普通方法,并不会创建新的子线程,而是在原先的主线程中运行。
从注释中可以看到,start()方法会使线程“开始执行”【此处的执行,并不是线程开始真正的运行,只是达到就绪状态,当获取到cpu的时间分片后,才会真正运行】,JVM将会调用线程的run()方法。调用了start()方法后,会有两个线程同时并发运行:当前线程会返回到调用start()方法的位置,继续往下执行;子线程将会执行run()方法。线程的start()方法超过一次调用是不合法的,特别是线程一旦执行完成就不能被重新启动。
运行
达到就绪状态的线程,当获取到cpu的时间分片后,就会真正运行,运行时会执行线程的run()方法。
运行中线程调用yield()方法,可以让出处理器的使用,重新回到就绪状态。
阻塞
让线程阻塞的方式有很多:
调用线程的suspend()方法,但是这个方法已过时!
调用线程的wait()方法
调用线程的sleep(long millis)或sleep(long millis, int nanos)方法
等待获取同步锁
主线程调用子线程的join()方法,主线程将会阻塞,直到子线程执行完毕,主线程才会继续执行join()方法后的逻辑
阻塞的线程也会在一定的条件下重新回到就绪状态:
调用线程的resume()方法,但是这个方法已过时!
调用线程的notify()或notifyAll()方法
当线程睡眠指定的时间后将会重新回到就绪状态
获取到同步锁后会重新回到就绪状态
子线程执行完成后,主线程会重新回到就绪状态
死亡
调用线程的stop()方法,但是该方法已过时!
线程正常执行完毕
线程执行过程中出错
线程执行过程中抛出异常并且没有被捕获