从网上看到的线程的六种状态图,很清晰地展示了各个状态之间的切换以及可能的方法。
-
BLOCKED和WAITING的区别
BLOCKED: 一般指的是被动阻塞,比如一个线程在synrhonized同步代码块外尝试获取锁时的阻塞;
WAITING: 一般指的是主动进入等待状态,比如调用sleep,wait等方法。
主观上我们可以认为BLOCKED和WAITING都是BLOCKED,因为《thinking in java》中,并没有更加详细地区分WAITING和BLOCKED,统一称为BLOCKED状态,而且,下面的概念也至关重要。
-
中断线程Interrupt
处于BLOCKED状态(包括BLOCKED和WAITING和TIMED WAITING)的线程可以被中断,线程进入BLOCKED(包括BLOCKED和WAITING和TIMED WAITING)状态的条件在上图中也很清楚了,常见的常见是:
-
- 调用sleep()方法;
- 调用wait()方法;
- 同步代码块外等待获取锁的线程;
- I/O流等待输入或者输出的过程。
-
中断线程的方法
-
- 调用threadObject.interrupt(), 立即将调用该方法的线程中断状态设置为true;
- 调用ExecutorService.shutdown(), 将闲置的线程中断状态设置为true,正在运行的线程不改变其中断状态;
- 调用ExecutorService.shutdownNow(), 将线程池中的所有线程无论是否正在运行,中断状态都设置为true;
- 使用ExecutorService.submit()方法,返回Future<?>, 使用Future.cancel(true)方法