溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

發(fā)布時(shí)間:2021-09-24 11:47:26 來(lái)源:億速云 閱讀:145 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要為大家展示了“Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些”這篇文章吧。

     線(xiàn)程狀態(tài)

    五個(gè)狀態(tài)新生、就緒、運(yùn)行死亡、阻塞

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    停止線(xiàn)程

    • 不推薦使用JDK提供的stop()、destroy()方法【已棄用】

    • 推薦線(xiàn)程自己停止

    • 建議用一個(gè)標(biāo)志位進(jìn)行終止變量,到flag=false,則終止線(xiàn)程運(yùn)行

    public class StopDemo implements Runnable {
        // 設(shè)置一個(gè)標(biāo)志位
        boolean flag = true;
    
        @Override
        public void run() {
            // 線(xiàn)程體使用該標(biāo)志
            while (flag) {
                System.out.println("runing....");
            }
        }
    
        // 設(shè)置一個(gè)公共的方法停止線(xiàn)程,轉(zhuǎn)換標(biāo)志位
        public void stop() {
            this.flag = false;
        }
    }

    線(xiàn)程休眠

    • sleep(時(shí)間)指定當(dāng)前線(xiàn)程阻塞的毫秒數(shù)

    • sleep存在異常 Interrupted Exception

    • sleep時(shí)間達(dá)到后線(xiàn)程進(jìn)入就緒狀態(tài)

    • sleep可以模擬網(wǎng)絡(luò)延時(shí),倒計(jì)時(shí)等

    • 每一個(gè)對(duì)象都有一個(gè)鎖,sleep不會(huì)釋放鎖(重點(diǎn)記下) 

    模擬網(wǎng)絡(luò)延遲(放大問(wèn)題的發(fā)生性)

    搶票:

    public class SleepDemo implements Runnable {
        // 票數(shù)
        private int tickeNum = 10;
    
        @Override
        public void run() {
            while (true) {
                if (tickeNum <= 0) {
                    break;
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                System.out.println(String.format("%s --> 拿到了第%d張票", Thread.currentThread().getName(), tickeNum--));
            }
        }
    
        public static void main(String[] args) {
            SleepDemo sleepDemo = new SleepDemo();
    
            new Thread(sleepDemo, "張三").start();
            new Thread(sleepDemo, "李四").start();
            new Thread(sleepDemo, "王五").start();
        }
    }

    從輸出結(jié)果看,第4張票被多個(gè)人搶到了,產(chǎn)生了線(xiàn)程安全問(wèn)題

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    模擬計(jì)時(shí)

    public class SleepDemo2 {
        // 模擬倒計(jì)時(shí)
        public static void countDown() {
            int num = 5;
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")));
                num--;
                if (num==0) {
                    break;
                }
            }
        }
    
        public static void main(String[] args) {
            countDown();
        }
    }

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    線(xiàn)程禮讓

    • 禮讓線(xiàn)程,讓當(dāng)前正在執(zhí)行的線(xiàn)程暫停,但不阻塞

    • 將線(xiàn)程從運(yùn)行狀態(tài)轉(zhuǎn)為就緒狀態(tài)

    • 讓CPU重新調(diào)度,禮讓不一定成功!看CPU心情

    public class YieldDemo {
        public static void main(String[] args) {
            MyYeild myYeild = new MyYeild();
            new Thread(myYeild, "a").start();
            new Thread(myYeild, "b").start();
        }
    }
    
    class MyYeild implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " 線(xiàn)程開(kāi)始");
            // 禮讓
            Thread.yield();
            System.out.println(Thread.currentThread().getName() + " 線(xiàn)程停止");
        }
    }

    如果a線(xiàn)程禮讓成功了,就會(huì)讓b線(xiàn)程先跑

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    插隊(duì)(線(xiàn)程強(qiáng)制執(zhí)行)

    • Join合并線(xiàn)程,待此線(xiàn)程執(zhí)行完成后,再執(zhí)行其他線(xiàn)程,其他線(xiàn)程阻塞

    • 可以想象成食堂插隊(duì)打飯。會(huì)讓線(xiàn)程阻塞,慎用。

    public class JoinDemo implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {
                System.out.println("vip來(lái)了" + i);
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            JoinDemo joinDemo = new JoinDemo();
            Thread thread = new Thread(joinDemo);
            thread.start();
    
            // 主線(xiàn)程
            for (int i = 0; i < 500; i++) {
                if (i == 200) {
                    // 插隊(duì)
                    thread.join();
                }
                System.out.println("main" + i);
            }
        }
    }

    在主線(xiàn)程中的i=100的時(shí)候,vip線(xiàn)程進(jìn)來(lái)插隊(duì),直到vip執(zhí)行完,主線(xiàn)程才繼續(xù)

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    線(xiàn)程狀態(tài)觀(guān)測(cè)

    通過(guò)一個(gè)枚舉常量:Thread.State

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    public class StateDemo {
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread(() -> {
                for (int i = 0; i < 5; i++) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("===========");
                }
            });
    
            // 觀(guān)察狀態(tài)  new
            System.out.println(thread.getState());
            // 啟動(dòng)后   run
            thread.start();
            System.out.println(thread.getState());
            // 只要線(xiàn)程不終止,就一直輸出狀態(tài)
            while (thread.getState() != Thread.State.TERMINATED) {
                Thread.sleep(500);
                System.out.println(thread.getState());
            }
        }
    }

    Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些

    線(xiàn)程優(yōu)先級(jí)

    • Java提供一個(gè)線(xiàn)程調(diào)度器來(lái)監(jiān)控程序中啟動(dòng)后進(jìn)入就緒狀態(tài)的所有線(xiàn)程,線(xiàn)程調(diào)度器按照優(yōu)先級(jí)決定應(yīng)該調(diào)度哪個(gè)線(xiàn)程來(lái)執(zhí)行

    • 線(xiàn)程的優(yōu)先級(jí)用數(shù)字表示,范圍從1~10

      • Thread.MIN PRIORITY = 1;

      • Thread.MAX PRIORITY = 10;

      • Thread.NORM PRIORITY = 5;

    • 使用以下方式改變或獲取優(yōu)先級(jí)

      • getPriority()、setPriority(int xxx)

    不一定線(xiàn)程優(yōu)先級(jí)高的會(huì)先跑,優(yōu)先級(jí)低也只是意味著獲得調(diào)度的概率低,并不是優(yōu)先級(jí)低就不會(huì)被調(diào)用了,主要還是取決于CPU調(diào)度,有可能會(huì)出現(xiàn)性能倒置。

    守護(hù)線(xiàn)程

    線(xiàn)程分為用戶(hù)線(xiàn)程和守護(hù)線(xiàn)程

    虛擬機(jī)必須確保用戶(hù)線(xiàn)程執(zhí)行完畢

    虛擬機(jī)不用等待守護(hù)線(xiàn)程執(zhí)行完畢

    如,后臺(tái)記錄操作日志,監(jiān)控內(nèi)存,垃圾回收,一些等待機(jī)制等等

    以上是“Java多線(xiàn)程中線(xiàn)程狀態(tài)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI