关于LockSupport阻塞问题
LockSupport-例子1
package com.example.sbdemo.utils;
import java.util.concurrent.locks.LockSupport;
public class Test3Main {
public static void main(String[] args) {
Thread mainThread = Thread.currentThread();
new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(mainThread);
// mainThread.interrupt();
}).start();
for (int i = 0; i < 10; i++) {
System.out.println("i= " + i);
// Thread.currentThread().interrupt();
LockSupport.park();
System.out.println(Thread.interrupted());
}
}
}
代码1执行结果:
代码1先打印i=0,然后被park,然后被子线程unpark后,恢复运行,打印i=1后,又继续被park住,程序没有终止
LockSupport-例子2
public class Test3Main {
public static void main(String[] args) {
Thread mainThread = Thread.currentThread();
new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//LockSupport.unpark(mainThread);
mainThread.interrupt();
}).start();
for (int i = 0; i < 10; i++) {
System.out.println("i= " + i);
// Thread.currentThread().interrupt();
LockSupport.park();
System.out.println(Thread.interrupted());
}
}
}
代码2执行结果:
代码2先打印i=0,然后被park,然后被子线程interrupt()后,恢复运行,打印i=1后,又继续被park住,程序没有终止
LockSupport-例子3
例子2的基础上,把 System.out.println(Thread.interrupted()); 这行代码注释掉
代码3执行结果:
程序打印所有数据,并结束
LockSupport-例子4
public class Test3Main {
public static void main(String[] args) {
Thread mainThread = Thread.currentThread();
new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//LockSupport.unpark(mainThread);
mainThread.interrupt();
}).start();
for (int i = 0; i < 10; i++) {
System.out.println("i= " + i);
// Thread.currentThread().interrupt();
if (i < 2) {
if (i == 1) {
Thread.currentThread().interrupt();
}
LockSupport.park();
}
System.out.println(Thread.interrupted());
}
}
}
代码执行结果:打印所有数据,并结束
总结:
1 有中断标志,程序不阻塞,没有中断标志,程序阻塞
2 Thread.interrupted() 返回线程中断状态并将中断标志清空,
并且重置中断状态
3 selfInterrupt() 补充中断状态,让程序自己判断什么时候安全的中断