LockSupport是一个线程工具类,主要是为了park()阻塞线程
,unpark()唤醒线程
的时候使用。
park:挂起当前线程,等待一个许可
unpark:为某个线程提供一个许可,唤醒指定线程
注意
调用一次unpark就➕1变成1;
调用一次park就会消费permit,也就是变成0,同时park立即返回。
如果再次调用park会变成阻塞(因为permit=0的时候会阻塞,一直等到permit变成1),这时候需要调用unpark会把permit置为1
/**
* 某个线程每个0.5秒输出n++,当num=20的时候,线程挂起,5s线程被唤醒,num被赋值为3继续执行
*/
public class LockSupportDemo {
public static void main(String[] args) {
Thread thread = new Thread(new LockSupportTest());
thread.start();
try {
TimeUnit.MILLISECONDS.sleep(500*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(thread);
System.out.println("5s后 unpark...");
}
}
class LockSupportTest implements Runnable{
Integer num=1;
@Override
public void run() {
while (true){
System.out.println("run:"+num);
num++;
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(num>5){
LockSupport.park();
System.out.println("park...");
num=3;
}
}
}
}
因为unpark获得了一个凭证,只有在调用park方法,就可以名正言顺的消费凭证,因此不会被阻塞。
因为凭证的数量最多为1,两次unpark和一次unpark的结果是一样的,只会增加一个凭证;
调用两次park却需要消费两个凭证,证不够,不能放行
demo来源:https://www.bilibili.com/video/BV1jm4y1S7PQ?spm_id_from=333.337.search-card.all.click&vd_source=b901ef0e9ed712b24882863596eab0ca