package seven;
import common.Utils;
/**
*
* 线程的阻塞
* 引起线程阻塞的方法有 sleep() wait(),join(会造成当前线程的阻塞,而前面两个会造成调用线程的阻塞)
* 当线程阻塞时,会进行阻塞队列,当有一个线程向阻塞线程发出中断请求时,被请求线程会在合理时刻对请求
* 进行处理,如果被请求的线程处于阻塞状态,则其会抛出 InterruptedException ,然后执行 catch()语句块
* 被请求线程会再次进入 runnable 队列等待 JVM的调度
*
*/
public class Blocking {
static final Object lock = new Object();
public static void main(String args[]) {
final Thread main = Thread.currentThread();
Thread reader = new Thread() {
@Override
public void run() {
synchronized(lock) {
try {
lock.wait(); //会使得这个线程从等待集合中被移除,
//使得它可以在再次获得锁之后,继续执行java.lang.InterruptedException异常的处理逻辑。
//所以并不是它中断后就执行异常里面的代码,而是其线程放入到就绪队列中,等待再次调入,然后执行异常
}catch(InterruptedException e) {
System.out.println(Thread.currentThread().getName()+" 被中断");
}
}
}
};
reader.start();
System.out.println("1s latter...");
Utils.sleep(1);
System.out.println(Thread.currentThread().getName()+" 向 reader 发送中断请求");
reader.interrupt(); // 主线程向 reader 发送了一个中断请求
}
}
线程的中断
最新推荐文章于 2024-04-21 11:52:37 发布