雖是讀書筆記,可是如轉載請註明出處 http://segmentfault.com/blog/exploring/
.. 拒絕伸手複製黨java
線程具備新建、可運行、阻塞、等待、定時等待、死亡六種。線程的狀態徹底包含了一個線程重新建到運行,最後到結束的整個生命週期,數據庫
線程狀態的具體信息以下:segmentfault
NEW(新建狀態、初始化狀態):線程對象已經被建立,可是尚未被啓動時的狀態。這段時間就是在咱們調用new命令以後,調用start()方法以前緩存
public enum State { /** * Thread state for a thread which has not yet started. */ NEW,
RUNNABLE(可運行狀態、就緒狀態):在咱們調用了線程的start()方法以後線程所處的狀態。處於RUNNABLE狀態的線程在JAVA虛擬機(JVM)上是運行着的,可是它可能還正在等待操做系統分配給它相應的運行資源
以得以運行。服務器
一旦一個線程開始運行,它沒必要始終保持運行。運行中的線程可能被中斷,爲了讓其餘線程得到運行機會 -- 線程調度
。 如今全部的桌面和服務器OS都使用搶佔式調用
。spa
/** * 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(阻塞狀態、被中斷運行):當一個線程試圖獲取一個內部的對象鎖
,而該鎖被其餘線程持有,則該線程進入阻塞狀態;當全部其餘線程釋放該鎖,而且線程調度器要容許本線程持有它的時候,該線程將變成非阻塞狀態。
操作系統
/** * 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,
當線程等待另外一個線程通知調度器的一個條件時,它本身進入等待狀態。
當前線程調用了java.lang.Object.wait()
、java.lang.Thread.join()
或者等待java.util.concurrent
庫中的Lock
或Condition
時,就會進入等待狀態
。線程
好比一個線程調用了某個對象的wait()方法,正在等待其它線程調用這個對象的notify()或者notifyAll()(這兩個方法一樣是繼承自Object類)方法來喚醒它;或者一個線程調用了另外一個線程的join()(這個方法屬於Thread類)方法,正在等待這個方法運行結束。code
/** * Thread state for a waiting thread. * A thread is in the waiting state due to calling one of the * following methods: * <ul> * <li> {@link Object#wait() Object.wait} with no timeout </li> * <li> {@link #join() Thread.join} with no timeout </li> * <li> {@link LockSupport#park() LockSupport.park} </li> * </ul> * * <p> A thread in the waiting state is waiting for another thread to * perform a particular action. * * For example, a thread that has called <tt> Object.wait()</tt> * on an object is waiting for another thread to call * <tt> Object.notify()</tt> or <tt>Object.notifyAll() </tt> on * that object. A thread that has called <tt> Thread.join()</tt> * is waiting for a specified thread to terminate. */ WAITING,
TIMED_WAITING(定時等待狀態):當前線程調用了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
四個方法中的任意一個,進入等待狀態,可是與WAITING狀態不一樣的是,它有一個最大等待時間,即便等待的條件仍然沒有知足,只要到了這個時間它就會自動醒來。orm
* 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: * <ul> * <li> {@link #sleep Thread.sleep}</li> * <li> {@link Object#wait(long) Object.wait} with timeout</li> * <li> {@link #join(long) Thread.join} with timeout </li> * <li> {@link LockSupport#parkNanos LockSupport.parkNanos}</li> * <li> {@link LockSupport#parkUntil LockSupport.parkUntil}</li> * </ul> */ TIMED_WAITING,
TERMINATED(死亡狀態、終止狀態):
線程完成執行後的狀態。線程執行完run()方法中的所有代碼,從該方法中退出,進入TERMINATED狀態。
還有一種狀況是run()在運行過程當中拋出了一個異常,而這個異常沒有被程序捕獲,致使這個線程異常終止進入TERMINATED狀態
/** * Thread state for a terminated thread. * The thread has completed execution. */ TERMINATED; }
線程的屬性:線程優先級,守護線程,線程組以及處理未捕獲異常的處理器。
java語言,每個線程有一個優先級
. 默認狀況,一個線程繼承它父線程的優先級。
能夠用setPriority
方法下降或提升任何線程的優先級。 使用yield()
方法讓當前執行的線程處於讓步,若是有其餘的runnable線程具備至少與此線程一樣的優先級,那麼這些線程接下來會被調度。
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;
能夠經過調用
t.setDaemon(true);
將線程轉換爲守護線程。守護線程惟一的用途就是爲其餘線程服務。
計時線程就是一個守護線程:它定時地發送「計時器滴答」信號給其餘線程或清空過期的高速緩存項的線程。
當只剩下守護線程,JVM就退出了。守護線程不該該去訪問任何固有資源,如文件,數據庫,由於它會在任什麼時候候甚至在一個操做中發生中斷。
線程run方法不能跑出任何被檢測的異常,可是不被檢測的異常會致使線程終止,這種狀況,線程就死亡了。