摘要:死亡狀態(tài)終止?fàn)顟B(tài)線程完成執(zhí)行后的狀態(tài)。守護(hù)線程唯一的用途就是為其他線程服務(wù)。計(jì)時(shí)線程就是一個(gè)守護(hù)線程它定時(shí)地發(fā)送計(jì)時(shí)器滴答信號(hào)給其他線程或清空過(guò)時(shí)的高速緩存項(xiàng)的線程。
雖是讀書(shū)筆記,但是如轉(zhuǎn)載請(qǐng)注明出處 http://segmentfault.com/blog/exploring/
.. 拒絕伸手復(fù)制黨
線程具有新建、可運(yùn)行、阻塞、等待、定時(shí)等待、死亡六種。線程的狀態(tài)完全包含了一個(gè)線程從新建到運(yùn)行,最后到結(jié)束的整個(gè)生命周期,
線程狀態(tài)的具體信息如下:
NEW(新建狀態(tài)、初始化狀態(tài)):線程對(duì)象已經(jīng)被創(chuàng)建,但是還沒(méi)有被啟動(dòng)時(shí)的狀態(tài)。這段時(shí)間就是在我們調(diào)用new命令之后,調(diào)用start()方法之前
public enum State { /** * Thread state for a thread which has not yet started. */ NEW,
RUNNABLE(可運(yùn)行狀態(tài)、就緒狀態(tài)):在我們調(diào)用了線程的start()方法之后線程所處的狀態(tài)。處于RUNNABLE狀態(tài)的線程在JAVA虛擬機(jī)(JVM)上是運(yùn)行著的,但是它可能還正在等待操作系統(tǒng)分配給它相應(yīng)的運(yùn)行資源以得以運(yùn)行。
一旦一個(gè)線程開(kāi)始運(yùn)行,它不必始終保持運(yùn)行。運(yùn)行中的線程可能被中斷,為了讓其他線程獲得運(yùn)行機(jī)會(huì) -- 線程調(diào)度。 現(xiàn)在所有的桌面和服務(wù)器OS都使用搶占式調(diào)用。
/** * 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,
BLOCKED(阻塞狀態(tài)、被中斷運(yùn)行):當(dāng)一個(gè)線程試圖獲取一個(gè)內(nèi)部的對(duì)象鎖,而該鎖被其他線程持有,則該線程進(jìn)入阻塞狀態(tài);當(dāng)所有其他線程釋放該鎖,并且線程調(diào)度器要允許本線程持有它的時(shí)候,該線程將變成非阻塞狀態(tài)。
/** * 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,
當(dāng)線程等待另一個(gè)線程通知調(diào)度器的一個(gè)條件時(shí),它自己進(jìn)入等待狀態(tài)。
當(dāng)前線程調(diào)用了java.lang.Object.wait()、java.lang.Thread.join()或者等待java.util.concurrent庫(kù)中的Lock或Condition時(shí),就會(huì)進(jìn)入等待狀態(tài)。
比如一個(gè)線程調(diào)用了某個(gè)對(duì)象的wait()方法,正在等待其它線程調(diào)用這個(gè)對(duì)象的notify()或者notifyAll()(這兩個(gè)方法同樣是繼承自O(shè)bject類)方法來(lái)喚醒它;或者一個(gè)線程調(diào)用了另一個(gè)線程的join()(這個(gè)方法屬于Thread類)方法,正在等待這個(gè)方法運(yùn)行結(jié)束。
/** * 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,
TIMED_WAITING(定時(shí)等待狀態(tài)):當(dāng)前線程調(diào)用了java.lang.Object.wait(long timeout)、java.lang.Thread.join(long millis) 、 java.util.concurrent.locks.LockSupport.packNanos(long nanos) 、 java.util.concurrent.locks.LockSupport.packUntil(long deadline 四個(gè)方法中的任意一個(gè),進(jìn)入等待狀態(tài),但是與WAITING狀態(tài)不同的是,它有一個(gè)最大等待時(shí)間,即使等待的條件仍然沒(méi)有滿足,只要到了這個(gè)時(shí)間它就會(huì)自動(dòng)醒來(lái)。
* 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: *
TERMINATED(死亡狀態(tài)、終止?fàn)顟B(tài)):
線程完成執(zhí)行后的狀態(tài)。線程執(zhí)行完run()方法中的全部代碼,從該方法中退出,進(jìn)入TERMINATED狀態(tài)。
還有一種情況是run()在運(yùn)行過(guò)程中拋出了一個(gè)異常,而這個(gè)異常沒(méi)有被程序捕獲,導(dǎo)致這個(gè)線程異常終止進(jìn)入TERMINATED狀態(tài)
/** * Thread state for a terminated thread. * The thread has completed execution. */ TERMINATED; }線程的屬性
線程的屬性:線程優(yōu)先級(jí),守護(hù)線程,線程組以及處理未捕獲異常的處理器。
線程優(yōu)先級(jí)java語(yǔ)言,每一個(gè)線程有一個(gè)優(yōu)先級(jí). 默認(rèn)情況,一個(gè)線程繼承它父線程的優(yōu)先級(jí)。
可以用setPriority方法降低或提高任何線程的優(yōu)先級(jí)。 使用yield()方法讓當(dāng)前執(zhí)行的線程處于讓步,如果有其他的runnable線程具有至少與此線程同樣的優(yōu)先級(jí),那么這些線程接下來(lái)會(huì)被調(diào)度。
java /** * The minimum priority that a thread can have. */ public final static int MIN_PRIORITY = 1; /** * The default priority that is assigned to a thread. */ public final static int NORM_PRIORITY = 5; /** * The maximum priority that a thread can have. */ public final static int MAX_PRIORITY = 10;守護(hù)線程
可以通過(guò)調(diào)用
t.setDaemon(true);
將線程轉(zhuǎn)換為守護(hù)線程。守護(hù)線程唯一的用途就是為其他線程服務(wù)。
計(jì)時(shí)線程就是一個(gè)守護(hù)線程:它定時(shí)地發(fā)送“計(jì)時(shí)器滴答”信號(hào)給其他線程或清空過(guò)時(shí)的高速緩存項(xiàng)的線程。
當(dāng)只剩下守護(hù)線程,JVM就退出了。守護(hù)線程不應(yīng)該去訪問(wèn)任何固有資源,如文件,數(shù)據(jù)庫(kù),因?yàn)樗鼤?huì)在任何時(shí)候甚至在一個(gè)操作中發(fā)生中斷。
未捕獲異常處理器線程run方法不能跑出任何被檢測(cè)的異常,但是不被檢測(cè)的異常會(huì)導(dǎo)致線程終止,這種情況,線程就死亡了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64365.html
摘要:請(qǐng)參看前一篇文章并發(fā)學(xué)習(xí)筆記一原子性可見(jiàn)性有序性問(wèn)題六等待通知機(jī)制什么是等待通知機(jī)制當(dāng)線程不滿足某個(gè)條件,則進(jìn)入等待狀態(tài)如果線程滿足要求的某個(gè)條件后,則通知等待的線程重新執(zhí)行。經(jīng)極客時(shí)間并發(fā)編程實(shí)戰(zhàn)專欄內(nèi)容學(xué)習(xí)整理 請(qǐng)參看前一篇文章:Java 并發(fā)學(xué)習(xí)筆記(一)——原子性、可見(jiàn)性、有序性問(wèn)題 六、等待—通知機(jī)制 什么是等待通知—機(jī)制?當(dāng)線程不滿足某個(gè)條件,則進(jìn)入等待狀態(tài);如果線程滿足要...
摘要:最后,總結(jié)一下,導(dǎo)致并發(fā)問(wèn)題的三個(gè)源頭分別是原子性一個(gè)線程在執(zhí)行的過(guò)程當(dāng)中不被中斷。可見(jiàn)性一個(gè)線程修改了共享變量,另一個(gè)線程能夠馬上看到,就叫做可見(jiàn)性。 計(jì)算機(jī)的 CPU、內(nèi)存、I/O 設(shè)備的速度一直存在較大的差異,依次是 CPU > 內(nèi)存 > I/O 設(shè)備,為了權(quán)衡這三者的速度差異,主要提出了三種解決辦法: CPU 增加了緩存,均衡和內(nèi)存的速度差異 發(fā)明了進(jìn)程、線程,分時(shí)復(fù)用 CP...
摘要:除此之外,把并發(fā)安全字典封裝在一個(gè)結(jié)構(gòu)體類型中,往往是一個(gè)很好的選擇。請(qǐng)看下面的代碼如上所示,我編寫(xiě)了一個(gè)名為的結(jié)構(gòu)體類型,它代表了鍵類型為值類型為的并發(fā)安全字典。在這個(gè)結(jié)構(gòu)體類型中,只有一個(gè)類型的字段。34 | 并發(fā)安全字典sync.Map (上)我們今天再來(lái)講一個(gè)并發(fā)安全的高級(jí)數(shù)據(jù)結(jié)構(gòu):sync.Map。眾所周知,Go 語(yǔ)言自帶的字典類型map并不是并發(fā)安全的。前導(dǎo)知識(shí):并發(fā)安全字典誕生...
閱讀 863·2021-11-24 09:38
閱讀 1096·2021-10-08 10:05
閱讀 2587·2021-09-10 11:21
閱讀 2809·2019-08-30 15:53
閱讀 1834·2019-08-30 15:52
閱讀 1973·2019-08-29 12:17
閱讀 3423·2019-08-29 11:21
閱讀 1616·2019-08-26 12:17