image.png


package com.juc;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;

public class T04_ThreadSatte {
    public static void main(String[] args) throws Exception {

        Thread t1 = new Thread(()->{
            System.out.println("2: " + Thread.currentThread().getState());
            for (int i = 0; i < 3; i++) {
                SleepHelp.sleepSecond(1);
                System.out.print(i+ " ");
            }
            System.out.println();
        });
        System.out.println("1: "+t1.getState());
        t1.start();
        t1.join();
        System.out.println("3: "+t1.getState());

        //======================================
        Thread t2 = new Thread(()->{
            try {
                LockSupport.park();
                System.out.println("t2 go on!");
                TimeUnit.SECONDS.sleep(5);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        });
        t2.start();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("4: "+t2.getState());

        LockSupport.unpark(t2);
        TimeUnit.SECONDS.sleep(1);
        System.out.println("5: "+ t2.getState());

        //====================================== sync 拿不到锁,状态是blocked
        final Object o = new Object();
        Thread t3 = new Thread(()->{
            synchronized (o){
                System.out.println("t3 得到了锁🔒o");
            }
        });

        new Thread(()->{
            synchronized (o){
                SleepHelp.sleepSecond(5);
            }
        }).start();

        SleepHelp.sleepSecond(1);

        t3.start();
        SleepHelp.sleepSecond(1);
        System.out.println("6: " + t3.getState());

        //====================================== 除了sync 抢不到所是blocked 其它都是 waiting
        final Lock lock = new ReentrantLock();
        Thread t4 = new Thread(()->{
            lock.lock();
            System.out.println("t4 得到了锁 😯");
        });

        new Thread(()->{
            lock.lock();
            SleepHelp.sleepSecond(5);
            lock.lock();
        }).start();

        SleepHelp.sleepSecond(1);

        t4.start();
        SleepHelp.sleepSecond(1);
        System.out.println("7: " + t4.getState());

        //======================================
        Thread t5 = new Thread(()->{
           LockSupport.park();
        });

        t5.start();

        SleepHelp.sleepSecond(1);
        System.out.println("8: "+ t5.getState());
        LockSupport.unpark(t5);
        
    }
}