package com.example.questions.thread.base;
import java.util.concurrent.locks.LockSupport;
public class LockSupportTest {
public static void main(String[] args) {
/**
* Thread 对象 的native方法中大概有两个变量
* 1. 1个代表线程的中断状态 默认false
*
* 2. 1个代表线程是否可以阻塞的许可permit,我们可以认为它是一个int型的变量,
* 但它的值只能为0或1。当为1时,再累加也会维持1。初始为0。
*
*
* park() 大概有2个判断
*
* 1. 判断permit 是不是 >0 如果 >0 则permit置0 并return跳出park方法 因为下面的程序有阻塞调用 这样就不被阻塞
*
* 2. 判断中断状态 如果是true 也会return跳出park方法 也不会执行下面的阻塞方法调用
*
* park只会消除permit 不会改变中断状态
*
* unpark 将permit置为1 并将阻塞线程变为可运行状态
*
* interrupt() 会调用unpark并把state状态设置为true
*
*/
//线程默认 permit = 0 state = false 所以线程会阻塞
// LockSupport.park();
// System.out.println(123);
//只要当前线程的permit为1 就能通过park方法
// LockSupport.unpark(Thread.currentThread());
// System.out.println(123);
// LockSupport.park();
// System.out.println(222);
// LockSupport.park();
// System.out.println(333);
//interrupt 内部会调用unpark方法
// Thread.currentThread().interrupt();
// System.out.println(123);
// LockSupport.park();
// System.out.println(222);
//park不会改变state状态 如果state状态为true 则park 通过 interrupt会将当前线程的state状态设置为true 并调用unpark方法
// Thread.currentThread().interrupt();
// LockSupport.park(); //消耗掉permit后,直接返回了
// LockSupport.park(); //因为中断状态 == true,直接返回了
// LockSupport.park(); //同上
// System.out.println(123);
//sleep会将state状态转为false wait/join 效果同sleep
Thread.currentThread().interrupt(); //此时state = true, permit = 1
LockSupport.park(); //消耗掉permit后,直接返回了
System.out.println(123);
LockSupport.park(); //因为中断状态 == true,直接返回了
System.out.println(222);
try {
Thread.sleep(1000);//state = false
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.park(); // 阻塞 333不能执行
System.out.println(333);
}
}
LockSupport类的总结
最新推荐文章于 2021-07-30 13:53:27 发布