第21章 – 并发 – 线程阻塞,线程中断,何时以及如何响应中断
1.在线程阻塞时中断
线程的4中状态:
(1) 新建(new):线程被创建时,它只会短暂的处于这种状态.
此时线程已经分配了必须的系统资源,并执行了初始化.
此刻线程已经有资格获取CPU时间,之后调度器将把这个线程转变为可运行状态
或阻塞状态
(2) 就绪(Runnable):在这种状态下,只要调度器把时间片分配给线程,线程就可以运行.
也就是说,在任意时刻线程可以运行也可以不运行.只要调度器能分配时间片给线程,
它就可以运行,这不同于阻塞和死亡状态.
(3) 阻塞(Blocked): 线程能够运行,但有某个条件阻止它运行.当线程处于阻塞状态时,
调度器将忽略该线程,不会分配给线程任何CPU时间.直到线程重新进入了就绪状态,
它才有可能执行操作.
(4) 处于死亡或终止状态的线程将不再是可调度的,并且也不会得到CPU时间,它的任务
已结束,或不再是可运行的.任务死亡的通常方式是从run()方法返回,但任务的线程
还可以被中断.
任务进入阻塞状态的4个原因:
(1) 通过调用sleep(milliseconds)使任务进入休眠状态,此时,任务在指定的时间内不会运行
(2) 通过调用wait()是线程挂起,直到线程得到了notify()或notifyAll()消息(或signal(),
signalAll()消息),线程才会进入就绪状态
(3)任务在等待某个输入/输出完成
(4) 任务视图在某个对象上调用其同步控制方法,但是对象的锁不可用,因为另一个任务已经
获取了锁.
另,在当前现场上调用其他线程的join()方法时,也会引起当前线程阻塞(Java并发编程实践(童云兰等译)P115).
2. sleep()造成