代碼模擬線程的6種狀態

線程6種狀態:

  • NEW

Thread state for a thread which has not yet started.

  • RUNNABLE

Thread state for a runnable thread. A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.

  • BLOCKED

Thread state for a thread blocked waiting for a monitor lock. A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method after calling Object.wait.

  • WAITING

Thread state for a waiting thread. A thread is in the waiting state due to calling one of the following methods:

  • Object.wait with no timeout
  • Thread.join with no timeout
  • LockSupport.park

A thread in the waiting state is waiting for another thread to perform a particular action. For example, a thread that has called Object.wait() on an object is waiting for another thread to call Object.notify() or Object.notifyAll() on that object. A thread that has called Thread.join() is waiting for a specified thread to terminate.

  • TIME_WAITING

Thread state for a waiting thread with a specified waiting time. A thread is in the timed waiting state due to calling one of the following methods with a specified positive waiting time:

  • Thread.sleep
  • Object.wait with timeout
  • Thread.join with timeout
  • LockSupport.parkNanos
  • LockSupport.parkUntil
  • TERMINATED

Thread state for a terminated thread. The thread has completed execution.

代碼模擬線程的6種狀態

public class ThreadState {

    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++){
                SleepHelp1.sleepseconds(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(()->{
            //阻塞  等着被叫醒  waiting
            LockSupport.park();
            System.out.println("t2 go on");
            SleepHelp1.sleepseconds(5);

        });
        t2.start();
        SleepHelp1.sleepseconds(1);
        System.out.println("4:"+t2.getState());

        //叫醒線程
        LockSupport.unpark(t2);
        SleepHelp1.sleepseconds(1);
        System.out.println("5:"+t2.getState());
        //=====================================================================

        final Object o = new Object();
        Thread t3 = new Thread(()->{
            synchronized (o){
                System.out.println("t3 得到了 鎖 o");
            }
        });

        new Thread(()->{
            synchronized (o){
                SleepHelp1.sleepseconds(5);
            }
        }).start();

        SleepHelp1.sleepseconds(1);

        t3.start();

        SleepHelp1.sleepseconds(1);

        System.out.println("6:"+t3.getState());
        //===========================================================
        //juc的鎖 盲等待, 不會進入 block 的狀態,進入 waiting 狀態
        final Lock lock = new ReentrantLock();
        Thread t4 = new Thread(()->{
            lock.lock();//省略掉 try ... finally
            System.out.println("t4 拿到了鎖 o");
            lock.unlock();
        });

        new Thread(()->{
            lock.lock();
            SleepHelp1.sleepseconds(5);
            lock.unlock();
        }).start();

        SleepHelp1.sleepseconds(1);

        t4.start();

        SleepHelp1.sleepseconds(1);

        System.out.println("7:"+t4.getState());
        //=======================================================
        Thread t5 = new Thread(()->{
            LockSupport.park();
        });

        t5.start();

        SleepHelp1.sleepseconds(1);

        System.out.println("8:"+t5.getState());

        SleepHelp1.sleepseconds(1);

        LockSupport.unpark(t5);
    }

}

class SleepHelp1 {

    public static void sleepseconds(int seconds){
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

執行結果:

1:NEW
2:RUNNABLE
0 1 2 
3:TERMINATED
4:WAITING
t2 go on
5:TIMED_WAITING
6:BLOCKED
7:WAITING
t3 得到了 鎖 o
8:WAITING
t4 拿到了鎖 o
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章