Java中线程的生命周期有6种,操作系统层面有5种。
线程的启动start(),调用的是本地方法start0(),JVM层面实现的。JVM调操作系统创建线程,启动线程,操作系统调用run()方法,JVM调用run()方法。操作系统通过调度算法,去调度CPU执行。执行结束后,JVM对线程进行销毁。
线程的终止,线程执行结束。线程有个中断标记,默认为false,interrupt()方法改变中断标记,某些情况下可以让线程自己处理外部中断。如果线程处于阻塞状态下,interrupt()方法会唤醒线程。wait()、sleep()等方法都会抛出InterruptedException,并清除中断标记,即恢复为默认false。
@throws InterruptedException if any thread interrupted the
* current thread before or while the current thread
* was waiting for a notification. The <i>interrupted
* status</i> of the current thread is cleared when
* this exception is thrown.
出现中断异常时,线程可能还没终止,如果要让线程终止,可以在捕获异常的时候通过Thread.currentThread().interrupt();
终止线程。
线程间的通信(wait/notify):多个线程执行的时候,如果一个线程需要等到另外的线程执行后才执行,可以使用wait使线程阻塞,进入等待队列,等另外的线程执行结束后通过notify唤醒进入同步队列(可以抢占锁)。线程间的通信的前提是,这些线程需要抢占同一把锁,获得锁的线程调用notify唤醒处于等待队列的线程。