欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java JVM中線程狀態(tài)詳解

 更新時間:2022年09月02日 09:14:39   作者:義臻  
這篇文章主要介紹了Java JVM中線程狀態(tài)詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的朋友可以參考一下

前言:

在Java面試中,線程的狀態(tài)也是被經(jīng)常考察的知識點,今天我們就來聊一聊線程狀態(tài)的那些事!

線程在JVM中的狀態(tài)

查看線程在JVM中有哪些不同的狀態(tài),最簡單的方式是查看Jdk源碼的Thread.State類。以下內(nèi)容來自JDK文檔。在JVM中,一個線程可能處于下面的六種狀態(tài)中的一種:

NEW

A thread that has not yet started is in this state. 沒有開始執(zhí)行的線程處于這種狀態(tài)

RUNNABLE

A thread executing in the Java virtual machine is in this state. 在JVM中執(zhí)行的線程處于這種狀態(tài)

BLOCKED

A thread that is blocked waiting for a monitor lock is in this state. 因為等待監(jiān)視器鎖而處于等待的線程處于這種狀態(tài)

WAITING

A thread that is waiting indefinitely for another thread to perform a particular action is in this state. 等待另一個線程執(zhí)行某些特別操作的線程處于這種狀態(tài)。補充:實際上,這個線程等待的條件稱為條件謂詞,這個線程等待的位置稱為條件隊列。來源大牛的書《Java Concurrency in Proactice》

TIMED_WAITING

A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state. 等待另一個線程執(zhí)行某些特別操作的線程(有時間限制)處于這種狀態(tài)

TERMINATED

A thread that has exited is in this state. 一個已經(jīng)執(zhí)行完畢的線程處于這種狀態(tài)

可見,一個線程在JVM中有6種不同的狀態(tài)。此處我想強調(diào)一下,這個線程在JVM中的狀態(tài),并不能反映操作系統(tǒng)級別的線程狀態(tài)。

線程在JVM中的狀態(tài)轉(zhuǎn)換

JDK源碼的注釋中詳細(xì)的描述了不同狀態(tài)之間在哪些條件下進(jìn)行轉(zhuǎn)換,本文中我用一個圖來進(jìn)行表示。 由于CPU的時間片輪轉(zhuǎn)機制,處于Runnable狀態(tài)的線程可以分為兩種:Ready(就緒)和Running(運行)。因此,我們的狀態(tài)圖中有7種狀態(tài)節(jié)點。

如下圖:

上圖中展示了線程在不同狀態(tài)之間的轉(zhuǎn)換情況,在調(diào)用與線程有關(guān)的方法后,線程會進(jìn)入不同的線程狀態(tài),這些狀態(tài)之間某些是雙向的,比如WAITING和RUNNING之間可以循環(huán)的進(jìn)行切換。而有些是單向的,比如終止后不能再次進(jìn)入終止?fàn)顟B(tài)。

針對上面的圖,可以詢問的面試點有很多。比如線程的監(jiān)視器鎖機制、比如線程協(xié)同的機制等等,讀者要結(jié)合圖片仔細(xì)研究。最后是一個例子,展示了5種線程狀態(tài)(除Waiting狀態(tài))。

import java.util.concurrent.TimeUnit;

/**
 * Created by yizhenn on 2020/4/20.
 */
public class Demo{
    private static Object lock=new Object();
    public static void main(String[] args) throws Exception {
       Thread t1=new Thread(new Runnable() {
           @Override
           public void run() {
               synchronized (lock){
                   System.out.println("t1 executing...");
                   try {
                       TimeUnit.SECONDS.sleep(10);
                   }catch (Exception e){
                       e.printStackTrace();
                   }
               }
           }
       });
        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    System.out.println("t2 executing...");
                    try {
                        TimeUnit.SECONDS.sleep(10);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        });
        System.out.println(t1.getState());
        System.out.println(t2.getState());
        t1.start();
        t2.start();
        System.out.println(t1.getState());
        System.out.println(t2.getState());
        TimeUnit.SECONDS.sleep(11);
        System.out.println(t1.getState());
        System.out.println(t2.getState());
        TimeUnit.SECONDS.sleep(11);
        System.out.println(t1.getState());
        System.out.println(t2.getState());
    }
}

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

相關(guān)文章

  • Druid(新版starter)在SpringBoot下的使用教程

    Druid(新版starter)在SpringBoot下的使用教程

    Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強大的監(jiān)控和擴展功能,DruidDataSource支持的數(shù)據(jù)庫,這篇文章主要介紹了Druid(新版starter)在SpringBoot下的使用,需要的朋友可以參考下
    2023-05-05
  • Spring整合websocket整合應(yīng)用示例(下)

    Spring整合websocket整合應(yīng)用示例(下)

    這篇文章主要介紹了Spring整合websocket整合應(yīng)用示例(下)的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • 基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實踐

    基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實踐

    這篇文章主要介紹了基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實踐,需要的朋友可以參考下
    2024-08-08
  • Java設(shè)計模式之策略模式詳細(xì)解析

    Java設(shè)計模式之策略模式詳細(xì)解析

    這篇文章主要介紹了Java設(shè)計模式之策略模式詳細(xì)解析,策略模式中,定義算法族,分別封裝起來,讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨立于使用算法的客戶,需要的朋友可以參考下
    2023-11-11
  • Java設(shè)計模式之命令模式

    Java設(shè)計模式之命令模式

    這篇文章介紹了Java設(shè)計模式之命令模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Java線程變量ThreadLocal詳細(xì)解讀

    Java線程變量ThreadLocal詳細(xì)解讀

    這篇文章主要介紹了Java線程變量ThreadLocal詳細(xì)解讀,多線程訪問同一個變量的時候,很容易出現(xiàn)問題,特別是多線程對一個共享變量進(jìn)行寫入的時候,為了線程的安全在進(jìn)行數(shù)據(jù)寫入時候會進(jìn)行數(shù)據(jù)的同步,需要的朋友可以參考下
    2024-01-01
  • JAVA十大排序算法之基數(shù)排序詳解

    JAVA十大排序算法之基數(shù)排序詳解

    這篇文章主要介紹了java中的基數(shù)排序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Java開發(fā)常用類庫之Hutool詳解

    Java開發(fā)常用類庫之Hutool詳解

    這篇文章主要介紹了Java開發(fā)常用類庫之Hutool,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 淺析Java進(jìn)制轉(zhuǎn)換、輸入、命名問題

    淺析Java進(jìn)制轉(zhuǎn)換、輸入、命名問題

    這篇文章主要介紹了Java進(jìn)制轉(zhuǎn)換、輸入、命名問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例

    SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例

    本篇文章主要介紹了SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09

最新評論