JDK中阻塞线程运行的是LockSupport的park。JAVA中的线程的interrupt是不能阻塞
Thread t = new Thread(new Runnable(){
@Override
public void run() {
Thread.currentThread().interrupt();
int i = 0;
i++;
System.out.println("i="+i);
System.out.println(Thread.currentThread().isInterrupted());
}
});
t.start();
输入结果:
i=1
true
真正能挂起线程的是LockSupport的park,park是sun里面的unsafe类提供的底层挂起线程的方法,park(Object blocker) 表示阻塞指定线程,参数blocker当前线程对象 和unpark(Thread thread) 唤醒指定线程,参数thread指定线程对象。park是不可重入的。park解释为占用,线程在等待许可
park和unpark是不可以重入,下面的代码会让主线程一直处于等待
Thread thread = Thread.currentThread();
LockSupport.unpark(thread);//释放许可
LockSupport.unpark(thread);//释放许可
LockSupport.unpark(thread);//释放许可
LockSupport.park();// 获取许可
LockSupport.park();// 获取许可
System.out.println("b");