最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程之線程狀態(tài)詳解

 更新時(shí)間:2021年09月23日 11:42:39   作者:honvin_  
這篇文章主要介紹了Java多線程 線程狀態(tài)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

 線程狀態(tài)

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

在這里插入圖片描述

在這里插入圖片描述

停止線程

  • 不推薦使用JDK提供的stop()、destroy()方法【已棄用】
  • 推薦線程自己停止
  • 建議用一個(gè)標(biāo)志位進(jìn)行終止變量,到flag=false,則終止線程運(yùn)行
public class StopDemo implements Runnable {
    // 設(shè)置一個(gè)標(biāo)志位
    boolean flag = true;

    @Override
    public void run() {
        // 線程體使用該標(biāo)志
        while (flag) {
            System.out.println("runing....");
        }
    }

    // 設(shè)置一個(gè)公共的方法停止線程,轉(zhuǎn)換標(biāo)志位
    public void stop() {
        this.flag = false;
    }
}

線程休眠

  • sleep(時(shí)間)指定當(dāng)前線程阻塞的毫秒數(shù)
  • sleep存在異常 Interrupted Exception
  • sleep時(shí)間達(dá)到后線程進(jìn)入就緒狀態(tài)
  • sleep可以模擬網(wǎng)絡(luò)延時(shí),倒計(jì)時(shí)等
  • 每一個(gè)對(duì)象都有一個(gè)鎖,sleep不會(huì)釋放鎖(重點(diǎn)記下) 

模擬網(wǎng)絡(luò)延遲(放大問題的發(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)生了線程安全問題

在這里插入圖片描述

模擬計(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();
    }
}

在這里插入圖片描述

線程禮讓

  • 禮讓線程,讓當(dāng)前正在執(zhí)行的線程暫停,但不阻塞
  • 將線程從運(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() + " 線程開始");
        // 禮讓
        Thread.yield();
        System.out.println(Thread.currentThread().getName() + " 線程停止");
    }
}

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

在這里插入圖片描述

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

  • Join合并線程,待此線程執(zhí)行完成后,再執(zhí)行其他線程,其他線程阻塞
  • 可以想象成食堂插隊(duì)打飯。會(huì)讓線程阻塞,慎用。
public class JoinDemo implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("vip來了" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        JoinDemo joinDemo = new JoinDemo();
        Thread thread = new Thread(joinDemo);
        thread.start();

        // 主線程
        for (int i = 0; i < 500; i++) {
            if (i == 200) {
                // 插隊(duì)
                thread.join();
            }
            System.out.println("main" + i);
        }
    }
}

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

在這里插入圖片描述

線程狀態(tài)觀測(cè)

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

在這里插入圖片描述

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("===========");
            }
        });

        // 觀察狀態(tài)  new
        System.out.println(thread.getState());
        // 啟動(dòng)后   run
        thread.start();
        System.out.println(thread.getState());
        // 只要線程不終止,就一直輸出狀態(tài)
        while (thread.getState() != Thread.State.TERMINATED) {
            Thread.sleep(500);
            System.out.println(thread.getState());
        }
    }
}

在這里插入圖片描述

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

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

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

守護(hù)線程

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

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

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

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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java堆棧類使用實(shí)例(java中stack的使用方法)

    java堆棧類使用實(shí)例(java中stack的使用方法)

    java中stack的使用方法,堆棧是一種"后進(jìn)先出"(LIFO) 的數(shù)據(jù)結(jié)構(gòu), 只能在一端進(jìn)行插入(稱為"壓棧") 或刪除 (稱為"出棧")數(shù)據(jù)的操作,下面看示例吧
    2013-12-12
  • mybatis update更新字段的使用操作

    mybatis update更新字段的使用操作

    這篇文章主要介紹了mybatis update更新字段的使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 詳解java 中Spring jsonp 跨域請(qǐng)求的實(shí)例

    詳解java 中Spring jsonp 跨域請(qǐng)求的實(shí)例

    這篇文章主要介紹了詳解java 中Spring jsonp 跨域請(qǐng)求的實(shí)例的相關(guān)資料,jsonp 可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題,需要的朋友可以參考下
    2017-08-08
  • 關(guān)于fastjson的@JSONField注解的一些問題(詳解)

    關(guān)于fastjson的@JSONField注解的一些問題(詳解)

    下面小編就為大家?guī)硪黄P(guān)于fastjson的@JSONField注解的一些問題(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • java8使用filter()取出自己所需數(shù)據(jù)

    java8使用filter()取出自己所需數(shù)據(jù)

    這篇文章主要介紹了java8使用filter()取出自己所需數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Springboot中實(shí)現(xiàn)接口冪等性的4種方案小結(jié)

    Springboot中實(shí)現(xiàn)接口冪等性的4種方案小結(jié)

    本文主要介紹了Springboot中實(shí)現(xiàn)接口冪等性,包含數(shù)據(jù)庫的冪等,數(shù)據(jù)庫的冪等,Redis的冪等性和Token + 時(shí)間戳的冪等性,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java8中的default方法詳解

    Java8中的default方法詳解

    這篇文章主要介紹了Java8中的default方法詳解,Java 8新增了default方法,它可以在接口添加新功能特性,而且還不影響接口的實(shí)現(xiàn)類,需要的朋友可以參考下
    2015-03-03
  • springboot模塊里面調(diào)用另外一個(gè)模塊的方法實(shí)現(xiàn)

    springboot模塊里面調(diào)用另外一個(gè)模塊的方法實(shí)現(xiàn)

    在Spring-Boot項(xiàng)目開發(fā)中,存在著本模塊的代碼需要訪問外面模塊接口,本文就來介紹一下springboot模塊里面調(diào)用另外一個(gè)模塊的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-11-11
  • 一文帶你了解SpringBoot的停機(jī)方式

    一文帶你了解SpringBoot的停機(jī)方式

    停機(jī)簡(jiǎn)單的說,就是向應(yīng)用進(jìn)程發(fā)出停止指令之后,能保證正在執(zhí)行的業(yè)務(wù)操作不受影響,直到操作運(yùn)行完畢之后再停止服務(wù)。本文就來和大家聊聊Springboot的停機(jī)方式與停機(jī)處理
    2023-02-02
  • SpringBoot詳細(xì)講解如何創(chuàng)建及刷新Spring容器bean

    SpringBoot詳細(xì)講解如何創(chuàng)建及刷新Spring容器bean

    前面看spring源碼時(shí)可以發(fā)現(xiàn)refresh()方法十分重要。在這個(gè)方法中會(huì)加載beanDefinition,同時(shí)創(chuàng)建bean對(duì)象。那么在springboot中有沒有使用這個(gè)refresh()方法呢
    2022-06-06

最新評(píng)論

阳山县| 阿坝| 沙雅县| 依兰县| 乌兰察布市| 偃师市| 柳林县| 拉孜县| 定西市| 宜黄县| 聂荣县| 嵊州市| 太仓市| 栾城县| 深圳市| 石景山区| 错那县| 望都县| 玉屏| 丰镇市| 通城县| 新兴县| 华亭县| 南通市| 巴林左旗| 安陆市| 泸定县| 五原县| 五华县| 聂荣县| 富源县| 千阳县| 肃北| 岚皋县| 曲麻莱县| 鄂州市| 遂平县| 南郑县| 仙桃市| 武清区| 荆州市|