摘要:運(yùn)行中,線程狀態(tài)中并沒有這一狀態(tài),但是實(shí)際執(zhí)行中是有的可運(yùn)行狀態(tài)的線程獲得了時間片,執(zhí)行程序代碼。其他阻塞運(yùn)行的線程發(fā)出了請求時,會把該線程置為阻塞狀態(tài)。當(dāng)處理完畢時,線程重新轉(zhuǎn)入可運(yùn)行狀態(tài)。
Thread.State
首先看JDK中的代碼: java.lang.Thread.State
/** * A thread state. A thread can be in one of the following states: * 一個線程的狀態(tài),一個線程可以處于以下狀態(tài)中的某一個狀態(tài) *
* A thread can be in only one state at a given point in time. * These states are virtual machine states which do not reflect * any operating system thread states. * * @since 1.5 * @see #getState */ public enum State { /** * Thread state for a thread which has not yet started. */ NEW, ? /** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. */ RUNNABLE, ? /** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock * to enter a synchronized block/method or * reenter a synchronized block/method after calling * {@link Object#wait() Object.wait}. */ BLOCKED, ? /** * Thread state for a waiting thread. * A thread is in the waiting state due to calling one of the * following methods: *
A thread in the waiting state is waiting for another thread to * perform a particular action. * * For example, a thread that has called Object.wait() * on an object is waiting for another thread to call * Object.notify() or Object.notifyAll() on * that object. A thread that has called Thread.join() * is waiting for a specified thread to terminate. */ WAITING, ? /** * Thread state for a waiting thread with a specified waiting time. * A thread is in the timed waiting state due to calling one of * the following methods with a specified positive waiting time: *
新創(chuàng)建了一個線程對象,還未調(diào)用start()方法。
2、就緒(Runnable)線程對象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中 獲取cpu 的使用權(quán) 。
3、運(yùn)行中(Running,線程狀態(tài)中并沒有這一狀態(tài),但是實(shí)際執(zhí)行中是有的)可運(yùn)行狀態(tài)(runnable)的線程獲得了cpu 時間片(timeslice) ,執(zhí)行程序代碼。
4、限期等待(Timed Waiting)也可以稱作 TIMED_WAITING(有等待時間的等待狀態(tài))。
線程主動調(diào)用以下方法:
Thread.sleep方法;
Object的wait方法,帶有時間;
Thread.join方法,帶有時間;
LockSupport的parkNanos方法,帶有時間。
5、無限期等待(Waiting)運(yùn)行中(Running)的線程執(zhí)行了以下方法:
Object的wait方法,并且沒有使用timeout參數(shù);
Thread的join方法,沒有使用timeout參數(shù);
LockSupport的park方法;
Conditon的await方法。
6、阻塞(Blocked)阻塞狀態(tài)是指線程因為某種原因放棄了cpu 使用權(quán),暫時停止運(yùn)行。直到線程進(jìn)入可運(yùn)行(runnable)狀態(tài),才有機(jī)會再次獲得cpu timeslice 轉(zhuǎn)到運(yùn)行(running)狀態(tài)。阻塞的情況分兩種:
同步阻塞:運(yùn)行(running)的線程進(jìn)入了一個synchronized方法,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池(lock pool)中。
其他阻塞:運(yùn)行(running)的線程發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)I/O處理完畢時,線程重新轉(zhuǎn)入可運(yùn)行(runnable)狀態(tài)。
7、結(jié)束(Terminated)線程run()、main() 方法執(zhí)行結(jié)束,或者因異常退出了run()方法,則該線程結(jié)束生命周期。
線程狀態(tài)探秘jstack查看線程狀態(tài)
jstack -l
隨便寫一個死循環(huán)看一下
public class TestThreadState { public static void main(String[] args) { for (; ; ) { ? } } }
ps -ef|grep TestThreadState,找到對應(yīng)的pid,jstack -l
"main" #1 prio=5 os_prio=31 tid=0x00007f8194801800 nid=0x1603 runnable [0x000070000a9b4000] java.lang.Thread.State: RUNNABLE at org.java.bin.TestThreadState.main(TestThreadState.java:12)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73905.html
摘要:在領(lǐng)域,實(shí)現(xiàn)并發(fā)程序的主要手段就是多線程。可運(yùn)行狀態(tài)指的是線程可以分配執(zhí)行。當(dāng)?shù)却氖录霈F(xiàn)了,線程就會從休眠狀態(tài)轉(zhuǎn)換到可運(yùn)行狀態(tài)。導(dǎo)出線程棧,分析線程狀態(tài)是診斷并發(fā)問題的一個重要工具。 在 Java 領(lǐng)域,實(shí)現(xiàn)并發(fā)程序的主要手段就是多線程。線程是操作系統(tǒng)里的一個概念,雖然各種不同的開發(fā)語言如 Java、C# 等都對其進(jìn)行了封裝,但原理和思路都是相同都。Java 語言里的線程本質(zhì)上就是...
摘要:線程,有時被稱為輕量級進(jìn)程,,是程序執(zhí)行流的最小單元。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)出間斷性。在單個程序中同時運(yùn)行多個線程完成不同的工作,稱為多線程。當(dāng)狀態(tài)超時等待線程終止或者超時或者處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。 java多線程,先要知道什么是線程(Threads),為什么要使用多線程。 線程,有時被稱為輕量級進(jìn)程(Lightweight Process,LWP),...
摘要:當(dāng)狀態(tài)超時等待線程終止或者超時或者處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。死亡狀態(tài)線程執(zhí)行完了或者因異常退出了方法,該線程結(jié)束生命周期。線程加入方法,等待其他線程終止。一系列線程以某種順序啟動并不意味著將按該順序執(zhí)行。 初遇 Java給多線程編程提供了內(nèi)置的支持。一個多線程程序包含兩個或多個能并發(fā)運(yùn)行的部分。程序的每一部分都稱作一個線程,并且每個線程定義了一個獨(dú)立的執(zhí)行路徑。 多線程是多任務(wù)...
摘要:前言本文描述線程線程狀態(tài)及狀態(tài)轉(zhuǎn)換,不會涉及過多理論,主要以代碼示例說明線程狀態(tài)如何轉(zhuǎn)換。被終止線程執(zhí)行完畢正常結(jié)束或執(zhí)行過程中因未捕獲異常意外終止都會是線程進(jìn)入被終止?fàn)顟B(tài)。線程執(zhí)行完畢打印狀態(tài)。 前言 本文描述Java線程線程狀態(tài)及狀態(tài)轉(zhuǎn)換,不會涉及過多理論,主要以代碼示例說明線程狀態(tài)如何轉(zhuǎn)換。 基礎(chǔ)知識 1. 線程狀態(tài) 線程可以有6種狀態(tài): New(新建) Runnable(可運(yùn)...
摘要:線程可以處于以下狀態(tài)之一尚未啟動的線程處于此狀態(tài)。被阻塞等待監(jiān)視器鎖定的線程處于此狀態(tài)。無限期等待另一個線程執(zhí)行特定操作的線程處于此狀態(tài)。已退出的線程處于此狀態(tài)。調(diào)用的線程處于狀態(tài),以使指定的線程終止。 Java Thread 可能處在以下幾種狀態(tài) Java Doc 里通過一個枚舉類型 Enum 來定義。 線程可以處于以下狀態(tài)之一:showImg(https://segmentfaul...
摘要:線程的生命周期線程的生命周期大致可以分為下面五種狀態(tài)新建狀態(tài)就緒狀態(tài)運(yùn)行狀態(tài)休眠狀態(tài)終止?fàn)顟B(tài)新建狀態(tài),是線程被創(chuàng)建且未啟動的狀態(tài)這里的創(chuàng)建,僅僅是在的這種編程語言層面被創(chuàng)建,而在操作系統(tǒng)層面,真正的線程還沒有被創(chuàng)建。 概要 目前CPU的運(yùn)算速度已經(jīng)達(dá)到了百億次每秒,甚至更高的量級,家用電腦即使維持操作系統(tǒng)正常運(yùn)行的進(jìn)程也會有數(shù)十個,線程更是數(shù)以百計。 線程是CPU的調(diào)度和分派的基本單位...
閱讀 3244·2021-11-11 11:00
閱讀 2565·2019-08-29 11:23
閱讀 1441·2019-08-29 10:58
閱讀 2323·2019-08-29 10:58
閱讀 2952·2019-08-23 18:26
閱讀 2507·2019-08-23 18:18
閱讀 2038·2019-08-23 16:53
閱讀 3411·2019-08-23 13:13