閱讀487 返回首頁    go 技術社區[雲棲]


java線程的6種狀態以及相互轉換

線程狀態
1、java線程有6中狀態,分別為NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED詳解java.lang.Thread$State枚舉類
2、線程初始化為NEW狀態,該狀態表示還未調用start方法
3、執行線程調用start方法,線程狀態轉換為RUNNABLE(包括競爭到CPU時間真正意義的執行和沒有競爭到CPU時間等待下一個CPU時間的狀態)
4、BLOCKED狀態為鎖競爭,沒有競爭到鎖為BLOCKED,等待擁有鎖的線程釋放鎖,進入RUNNABLE狀態
5、WAITING狀態為競爭到鎖,執行wait方法,又釋放鎖,本線程進入WAITING,等待其他線程喚醒notify,notifyall,如果不喚醒,將一直處於WAITING狀態
6、TIMED_WAITING為執行sleep join或者有時限的等待
7、線程執行完畢,線程處於TERMINATED狀態
線程狀態變化
_1

package com.rcl.platform.demo;

import java.util.concurrent.TimeUnit;

public class ThreadState {
    public static void main( String[] args ) throws InterruptedException {
        System.out.println("-------------NEW-------------");
        Thread thread = new Thread();
        System.out.println(thread.getState() + ":" + (thread.getState() == Thread.State.NEW));

        System.out.println("-------------分割線-------------");

        System.out.println("-------------RUNNABLE、TERMINATED-------------");
        thread = new Thread(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getState() + ":" + (Thread.currentThread().getState() == Thread.State.RUNNABLE));
            }
        });
        thread.start();

        TimeUnit.SECONDS.sleep(1);
        System.out.println(thread.getState() + ":" + (thread.getState() == Thread.State.TERMINATED));

        System.out.println("-------------分割線-------------");

        System.out.println("-------------RUNNABLE、TIMED_WAITING-------------");
        thread = new Thread(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getState() + ":" + (Thread.currentThread().getState() == Thread.State.RUNNABLE));
                System.out.println("sleep 進入 TIMED_WAITING");
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();

        TimeUnit.SECONDS.sleep(1);
        System.out.println(thread.getState() );
        TimeUnit.SECONDS.sleep(2);

        System.out.println("-------------分割線-------------");


        System.out.println("-------------RUNNABLE、TIMED_WAITING-------------");
        final Thread mainThread = Thread.currentThread();
        thread = new Thread(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getState() + ":" + (Thread.currentThread().getState() == Thread.State.RUNNABLE));
                try {
                    System.out.println("join 進入 TIMED_WAITING");
                    System.out.println("mainThread: " + mainThread.getState());
                    TimeUnit.SECONDS.timedJoin(mainThread, 2);//先執行mainthread 
                    System.out.println("mainThread: " + mainThread.getState());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("testThread: " + thread.getState() );

        System.out.println("-------------分割線-------------");

        System.out.println("-------------RUNNABLE、WAITING-------------");
        Object lock = new Object();
        final Thread mainThread1 = Thread.currentThread();
        thread = new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    try {
                        System.out.println("wait 進入 WAITING");
                        lock.wait();
                        System.out.println("mainThread1: " + mainThread1.getState() );
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        });
        thread.start();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("testThread: " + thread.getState() );
        synchronized (lock) {
            lock.notifyAll();
        }
        TimeUnit.SECONDS.sleep(1);

        System.out.println("-------------分割線-------------");
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        });
        thread1.start();
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {

                }
            }
        });
        thread2.start();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("thread2: " + thread2.getState() );
    }
}

執行結果


-------------NEW-------------
NEW:true
-------------分割線-------------
-------------RUNNABLE、TERMINATED-------------
RUNNABLE:true
TERMINATED:true
-------------分割線-------------
-------------RUNNABLE、TIMED_WAITING-------------
RUNNABLE:true
sleep 進入 TIMED_WAITING
TIMED_WAITING
-------------分割線-------------
-------------RUNNABLE、TIMED_WAITING-------------
RUNNABLE:true
join 進入 TIMED_WAITING
mainThread: TIMED_WAITING
testThread: TIMED_WAITING
-------------分割線-------------
-------------RUNNABLE、WAITING-------------
wait 進入 WAITING
mainThread: TIMED_WAITING
testThread: WAITING
mainThread1: TIMED_WAITING
-------------分割線-------------
thread2: BLOCKED

最後更新:2017-10-28 12:04:04

  上一篇:go  HTTP協議
  下一篇:go  第二屆HotDC合肥召開 阿裏雲英特爾聯合讚助