public class LockSupport {
    //线程工具类,可以让线程在任意位置阻塞;
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println(1);//先打印1
            try {
                Thread.sleep(1000);//停1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(2);//打印2
            java.util.concurrent.locks.LockSupport.park("我被阻塞了");//让线程使用LockSupport的方法阻塞线程
            System.out.println(3);//所以3应当是无法停下来的
        });
        thread.start();
        Thread.sleep(5000);
        //如果线程使用getBlocker之前时,就被唤醒了,那么是否还能获得内容
        java.util.concurrent.locks.LockSupport.unpark(thread);
        System.out.println("5秒已到");
        //答案是不可以如果线程使用getBlocker之前就被唤醒了,如果在此时使用这个方法,由于线程的阻塞与唤醒时成对的,一旦当前是唤醒的,就说明
        //上一次阻塞时是没有产生阻塞信息的提示的
        Object blocker = java.util.concurrent.locks.LockSupport.getBlocker(thread);//使用getBlocker方法获取线程park时所记录的信息;
        System.out.println(blocker);

        //java.util.concurrent.locks.LockSupport.unpark(thread);//在主线程中使用unpark唤醒线程,函数内需要传入需要唤醒的线程实例;
        //说明,park阻塞了线程,unpark唤醒了线程;








        //notify(),unpark方法的区别?
        //notify()的调用需要锁对象来调用,而unpark方法是LockSupport的静态方法,所以方法的调用是由LockSupport类来调用的;
        //notify是随机唤醒一个线程,而unpark可以传入需要唤醒的线程实例。
        //notify是所得一个成员方法,而unpark是java,util工具类,concurrent并发下面的Locks包下面的工具类的静态方法;简称(jucl);


//        java.util.concurrent.locks.LockSupport.park();
//        java.util.concurrent.locks.LockSupport.park("阻塞信息");常见的方法使用
//        java.util.concurrent.locks.LockSupport.parkNanos("",12);
//        java.util.concurrent.locks.LockSupport.parkUntil(12);
//        java.util.concurrent.locks.LockSupport.parkUntil("12ada",12);
//        java.util.concurrent.locks.LockSupport.unpark(thread);
        
    }
    
}