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

Java并發(fā)編程之線程狀態(tài)介紹

 更新時(shí)間:2022年04月18日 12:28:37   作者:派大大大星  
這篇文章主要介紹了Java并發(fā)編程之線程狀態(tài),當(dāng)線程被創(chuàng)建并啟動(dòng)以后,它既不是一啟動(dòng)就進(jìn)入了執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài),下面和小編一起進(jìn)入文章了解具體的相關(guān)介紹吧

線程狀態(tài)概述

線程由生到死的完整過程:

當(dāng)線程被創(chuàng)建并啟動(dòng)以后,它既不是一啟動(dòng)就進(jìn)入了執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài)。在線程的生命周期中,有幾種狀態(tài)呢?在API中java.lang.Thread.State這個(gè)枚舉中給出了六種線程狀態(tài):

線程狀態(tài)導(dǎo)致狀態(tài)發(fā)生條件
NEW(新建)線程剛被創(chuàng)建,但是并未啟動(dòng)。還沒調(diào)用start方法。MyThread t = new MyThread只有線程對(duì)象,沒有線程特征。
Runnable(可運(yùn)行)線程可以在java虛擬機(jī)中運(yùn)行的狀態(tài),可能正在運(yùn)行自己代碼,也可能沒有,這取決于操作系統(tǒng)處理器。調(diào)用了t.start()方法 :就緒(經(jīng)典教法)
Blocked(鎖阻塞)當(dāng)一個(gè)線程試圖獲取一個(gè)對(duì)象鎖,而該對(duì)象鎖被其他的線程持有,則該線程進(jìn)入Blocked狀態(tài);當(dāng)該線程持有鎖時(shí),該線程將變成Runnable狀態(tài)。
Waiting(無限等待)一個(gè)線程在等待另一個(gè)線程執(zhí)行一個(gè)(喚醒)動(dòng)作時(shí),該線程進(jìn)入Waiting狀態(tài)。進(jìn)入這個(gè)狀態(tài)后是不能自動(dòng)喚醒的,必須等待另一個(gè)線程調(diào)用notify或者notifyAll方法才能夠喚醒。
Timed Waiting(計(jì)時(shí)等待)同waiting狀態(tài),有幾個(gè)方法有超時(shí)參數(shù),調(diào)用他們將進(jìn)入Timed Waiting狀態(tài)。這一狀態(tài)將一直保持到超時(shí)期滿或者接收到喚醒通知。帶有超時(shí)參數(shù)的常用方法有Thread.sleep 、Object.wait。
Teminated(被終止)因?yàn)閞un方法正常退出而死亡,或者因?yàn)闆]有捕獲的異常終止了run方法而死亡。

在這里插入圖片描述

睡眠sleep方法

狀態(tài)中有一個(gè)狀態(tài)叫做計(jì)時(shí)等待,可以通過Thread類的方法來進(jìn)行演示。 public static void sleep(long time) 讓當(dāng)前線程進(jìn)入到睡眠狀態(tài),到毫秒后自動(dòng)醒來繼續(xù)執(zhí)行

//主線程執(zhí)行到sleep方法會(huì)休眠1秒后再繼續(xù)執(zhí)行
public class Test{
  public static void main(String[] args){
    for(int i = 1;i<=5;i++){
      	Thread.sleep(1000);
        System.out.println(i)   
    } 
  }
}

等待和喚醒

public void wait() : 讓當(dāng)前線程進(jìn)入到等待狀態(tài) 此方法必須鎖對(duì)象調(diào)用。

public class Demo1_wait {
    public static void main(String[] args) throws InterruptedException {
	   // 步驟1 : 子線程開啟,進(jìn)入無限等待狀態(tài), 沒有被喚醒,無法繼續(xù)運(yùn)行.
        new Thread(() -> {
            try {

                System.out.println("begin wait ....");
                synchronized ("") {
                    "".wait();
                }
                System.out.println("over");
            } catch (Exception e) {
            }
        }).start();
    }

public void notify() : 喚醒當(dāng)前鎖對(duì)象上等待狀態(tài)的線程 此方法必須鎖對(duì)象調(diào)用。

public class Demo2_notify {
    public static void main(String[] args) throws InterruptedException {
	   // 步驟1 : 子線程開啟,進(jìn)入無限等待狀態(tài), 沒有被喚醒,無法繼續(xù)運(yùn)行.
        new Thread(() -> {
            try {

                System.out.println("begin wait ....");
                synchronized ("") {
                    "".wait();
                }
                System.out.println("over");
            } catch (Exception e) {
            }
        }).start();

        //步驟2:  加入如下代碼后, 3秒后,會(huì)執(zhí)行notify方法, 喚醒wait中線程.
        Thread.sleep(3000);
        new Thread(() -> {
            try {
                synchronized ("") {
                    System.out.println("喚醒");
                    "".notify();
                }
            } catch (Exception e) {
            }
        }).start();
    }
}

等待喚醒的一個(gè)小例子

定義一個(gè)集合,包子鋪線程完成生產(chǎn)包子,包子添加到集合中;吃貨線程完成購買包子,包子從集合中移除。

  • 當(dāng)包子沒有時(shí)(包子狀態(tài)為false),吃貨線程等待.
  • 包子鋪線程生產(chǎn)包子(即包子狀態(tài)為true),并通知吃貨線程(解除吃貨的等待狀態(tài))
public class BaoZiPu extends Thread{
    private List<String> list ;
    public BaoZiPu(String name,ArrayList<String> list){
        super(name);
        this.list = list;
    }
    @Override
    public void run() {
        	int i = 0; 
            while(true){
                    //list作為鎖對(duì)象
                    synchronized (list){
                        if(list.size()>0){
                            //存元素的線程進(jìn)入到等待狀態(tài)
                            try {
                                list.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }

                        //如果線程沒進(jìn)入到等待狀態(tài) 說明集合中沒有元素
                        //向集合中添加元素
                        list.add("包子"+i++);
                        System.out.println(list);
                        //集合中已經(jīng)有元素了 喚醒獲取元素的線程
                        list.notify();
                    }
                }
            }
    }
}
public class ChiHuo extends Thread {

    private List<String> list ;
    public ChiHuo(String name,ArrayList<String> list){
        super(name);
        this.list = list;
    }

    @Override
    public void run() {
 			//為了能看到效果 寫個(gè)死循環(huán)
                while(true){
                    //由于使用的同一個(gè)集合 list作為鎖對(duì)象
                    synchronized (list){
                        //如果集合中沒有元素 獲取元素的線程進(jìn)入到等待狀態(tài)
                        if(list.size()==0){
                            try {
                                list.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        //如果集合中有元素 則獲取元素的線程獲取元素(刪除)
                        list.remove(0);
                        //打印集合 集合中沒有元素了
                        System.out.println(list);
                        //集合中已經(jīng)沒有元素 則喚醒添加元素的線程 向集合中添加元素
                        list.notify();
                    }
                }
            }
    }
}
public class Demo {
    public static void main(String[] args) {
        //等待喚醒案例
        List&lt;String&gt; list = new ArrayList&lt;&gt;();
        // 創(chuàng)建線程對(duì)象        
         BaoZiPu bzp = new BaoZiPu("包子鋪",list);
        ChiHuo ch = new ChiHuo("吃貨",list);
        // 開啟線程
        bzp.start();
        ch.start();
    }
}

到此這篇關(guān)于Java并發(fā)編程之線程狀態(tài)介紹的文章就介紹到這了,更多相關(guān)Java 線程狀態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問題

    MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問題

    這篇文章主要介紹了MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • IDEA使用SequenceDiagram插件繪制時(shí)序圖的方法

    IDEA使用SequenceDiagram插件繪制時(shí)序圖的方法

    這篇文章主要介紹了IDEA使用SequenceDiagram插件繪制時(shí)序圖的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java如何實(shí)現(xiàn)雙向鏈表功能

    Java如何實(shí)現(xiàn)雙向鏈表功能

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。一般我們都構(gòu)造雙向循環(huán)鏈表
    2021-11-11
  • java 抽象類和接口的區(qū)別詳細(xì)解析

    java 抽象類和接口的區(qū)別詳細(xì)解析

    abstractclass和interface是Java語言中對(duì)于抽象類定義進(jìn)行支持的兩種機(jī)制,正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的面向?qū)ο竽芰?需要了解的朋友可以參考下
    2012-11-11
  • IDEA項(xiàng)目的依賴(pom.xml文件)導(dǎo)入問題及解決

    IDEA項(xiàng)目的依賴(pom.xml文件)導(dǎo)入問題及解決

    這篇文章主要介紹了IDEA項(xiàng)目的依賴(pom.xml文件)導(dǎo)入問題及解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • idea配置連接數(shù)據(jù)庫的超詳細(xì)步驟

    idea配置連接數(shù)據(jù)庫的超詳細(xì)步驟

    這篇文章主要介紹了idea配置連接數(shù)據(jù)庫的超詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java等待喚醒機(jī)制線程通信原理解析

    Java等待喚醒機(jī)制線程通信原理解析

    這篇文章主要介紹了Java等待喚醒機(jī)制線程通信原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 一文帶你了解Java選擇排序的原理與實(shí)現(xiàn)

    一文帶你了解Java選擇排序的原理與實(shí)現(xiàn)

    選擇排序:(Selection sort)是一種簡單直觀的排序算法,也是一種不穩(wěn)定的排序方法。本文主要為大家介紹一下選擇排序的原理與實(shí)現(xiàn),希望對(duì)大家有所幫助
    2022-11-11
  • Java關(guān)系操作符簡寫介紹

    Java關(guān)系操作符簡寫介紹

    下面小編就為大家?guī)硪黄狫ava關(guān)系操作符簡寫介紹。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn)

    mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn)

    本文主要介紹了mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01

最新評(píng)論

宣汉县| 浮山县| 龙江县| 伽师县| 三河市| 金溪县| 绥阳县| 海南省| 卫辉市| 炉霍县| 汤阴县| 新昌县| 东安县| 乌兰浩特市| 临海市| 滁州市| 油尖旺区| 通州市| 洪洞县| 礼泉县| 清河县| 北京市| 张北县| 马边| 苍溪县| 和林格尔县| 湛江市| 同德县| 兴业县| 板桥市| 射洪县| 安康市| 卢龙县| 无为县| 偃师市| 朔州市| 丹阳市| 修武县| 墨竹工卡县| 仲巴县| 特克斯县|