線程是執行併發任務的最小單元。它有單獨的用於方法調用、參數和本地變量的堆棧。每個已啓動的虛擬機實例至少有一條主線程在運行;一般狀況下,會有另外幾條線程去進行一些事務操做。有時候爲了特殊的目的,應用程序也會添加一條子線程。 java
同一個VM中的線程經過使用共享對象和監控跟它們相關的一些對象來相互影響和同步。子線程之間的同步也可使用同步方法和Object類中的一些API(notify()、notifyAll()、wait()...)。 數組
程序代碼中,執行線程的最基本方法有兩種。一是提供一個新的繼承自Thread的類,而且重寫它的run()方法。另外一種方法是,在建立線程的時候提供一個Runnable接口的實現。 安全
在上述兩種狀況下,實際執行Thread的方法必須是start()方法。 併發
每條線程都有一個數字表示的優先級(最小爲1,最大爲10,主線程默認是5,子線程默認繼承父線程的優先級),優先級基本上決定了此線程能分配到的CPU處理時間的總額。優先級可使用setPriortity()方法來設置(最大不超過所屬ThreadGroup的優先級)。一條線程也能夠是Daemon Thread,這使得它能夠在後臺運行。後者還會影響VM的終止行爲:只要有非Daemon Thread運行,虛擬機就不會中止。 spa
線程的狀態(同時只能有下列枚舉中的一種狀態): 線程
public enum State{ NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED }線程的id = ++Thread.count,因此它是獨一無二的。
UncaughtExceptionHandler類能夠捕獲當前線程拋出的未經捕獲的異常。 code
在建立線程時,若是不指定ThreadGroup,則新線程歸屬於建立者線程所在的ThreadGroup。 對象
主要方法: 繼承
public void interrupt():給這條線程發送一箇中斷請求。若是調用者是currentThread(),方法checkAccess()就會被調用(若是有SecurityManager的話)。這可能會致使一個SecurityException被拋出,更進一步的行爲取決於線程當前的狀態:
若是線程阻塞於下面狀況:1)Object的某個wait()方法;2)線程的join()方法;3)線程的sleep()方法。線程將會被喚醒,它們的中斷狀態將會被清除,而且它們會接收到一個InterruptedException。
若是線程阻塞於java.nio.channels.InterruptiableChannel的I/O操做,將會設置它們的中斷狀態爲true,而且接收到一個java.nio.channels.ClosedByInterruptException。同時,這個通道將被關閉。
若是線程阻塞於java.nio.channels.Selector,將會設置它們的中斷狀態爲true而且當即返回。在這種狀況下不會拋出任何異常。 接口
public static boolean interrupted():返回一個表示currentThread()是否有一箇中斷請求的布爾值。它會清除這條線程的中斷標記,這時候它會有一個反作用(也就是,若是連續調用兩次此方法,若是第一次返回true,則第二次會返回false)。
public final boolean isAlive():返回一個表示線程生命狀態的布爾值。若是接收者已經開始(started)而且仍然在運行(尚未死亡),則返回true。當接收者尚未開始,或者它已經開始,並且已經執行結束而且死亡,則返回false。
public final boolean isDaemon():返回一個表示線程是否Daemon Thread的布爾值。Daemon Thread的運行取決於非Daemon Thread(即User Thread)的運行狀態。當最後一條User Thread結束的時候,不管是否有Daemon Thread在運行,整個程序都會結束。
public boolean isInterrupted():返回一個表示接收者是否有一箇中斷請求的布爾值。
public final void join():阻塞current Thread直到接收者執行完畢而且死亡。
public final void join() throws InterruptedException { VMThread t = vmThread; if (t == null) { return; } synchronized (t) { while (isAlive()) { t.wait(); } } }public final void join(long millis):阻塞current Thread直到下列兩種狀況知足至少一種:1)接收者執行完畢而且死亡;2)指定的時間終止。
public final void join(long millis, int nanos):阻塞current Thread直到下列兩種狀況知足至少一種:1)接收者執行完畢而且死亡;2)指定的時間終止。參數nanos:納秒級別的精確度。
public void run():調用接收者的Runnable對象的run()方法,若是沒有設置Runnable對象,則不作任何事。不要直接調用Thread或者Runnable的run方法。直接調用run方法,只會執行同一個線程中的任務,而不會啓動新線程。
public void setContextClassLoader(ClassLoader cl):設置接收者的context ClassLoader。
public final void setDaemon(boolean isDaemon):設置接收者是否爲Daemon Thread,這個方法必須在start()方法以前調用。
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler):設置默認的未捕獲異常處理器,這個處理器將會在有未處理的異常致使線程死亡時調用。
public final void setName(String threadName):設置線程的名字。
public final void setPriority(int priority):設置線程的優先級。注意:最終的優先級也許不是咱們傳入的值,由於它是依賴於接收者所在的ThreadGroup的。線程的優先級不能設置的比它所在的ThreadGroup的maxPriority()還高。
public void setUncaughtExceptionHandler(UncaughtExceptionHandler handler):設置未捕獲異常處理器,這個處理器將會在有未處理的異常致使線程死亡時調用。
public static void sleep(long time):使發送這條消息的線程睡眠指定的時間間隔(給定的毫秒)。這個方法的精確度沒法保證,線程的實際睡眠時間可能多於或少於指定的時間。
public static void sleep(long millis, int nanos):使發送這條消息的線程睡眠指定的時間間隔(給定的毫秒和納秒)。這個方法的精確度沒法保證,線程的實際睡眠時間可能多於或少於指定的時間。
public synchronized void start():啓動一條新線程,接收者線程將會調用它本身的run()方法。
public String toString():返回一個關於線程的簡潔的、人容易理解的描述。包括這個線程的名字、優先級和ThreadGroup的名字。
public static void yield():使用此方法將調用線程的執行時間給予另一條準備運行的線程。實際狀況依賴於實現(若是有其它的可運行(RUNNABLE)線程具備至少與此線程一樣高的優先級,那麼這些線程接下來會被調度)。注意,這是一個靜態方法。
public static boolean holdsLock(Object object):表示current Thread是否有一個在指定對象上的監控鎖。
public static int activeCount():返回正在運行的線程所在的ThreadGroup以及它的子Group中處於活動狀態的線程數量。
public final void checkAccess():用於檢查SecurityManager是否容許操做。若是沒有安裝SecurityManager,則不進行任何操做。若是安裝了SecurityManager的話,會調用此SecurityManager的checkAccess()方法。當SecurityManager已安裝,而且不容許訪問此線程時,拋出SecurityException。
public static Thread currentThread():返回調用者的線程,即當前線程。
public static void dumpStack():將此線程當前堆棧的標準錯誤流打印到一個文本。
public static int enumerate(Thread[] threads):將當前線程所在的ThreadGroup以及它的子ThreadGroup中的全部線程複製到傳入的線程數組中。若是傳入的這個線程數組過小,額外的線程將不會被複制進去。返回值是拷貝的線程數目。
public static Map<Thread, StackTraceElement[]> getAllStackTraces():返回全部當前存活的線程的堆棧軌跡。
public ClassLoader getContextClassLoader():返回此線程的上下文類加載器。若是知足如下條件,一個RuntimePermission("getClassLoader")的安全檢查將在第一時間被執行:1)當前有一個SecurityManager;2)調用者的類加載器不爲空;3)調用者的類加載器與被請求的上下文類加載器不同,而且二者不是一個原型。
public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler():返回默認的未捕獲異常處理器。
public long getId():返回當前線程的ID,這個ID是在線程建立的時候指定的lang型數值,這個值是獨一無二的,而且在線程的生命週期中不能更改。若是線程終止,這個值可能被重用。
public final String getName():返回線程的名字。
public final int getPriority():返回線程的優先級。
public StackTraceElement[] getStackTrace():返回描述此線程當前執行狀態的堆棧軌跡。返回結果以前會先檢查RuntimePermission("getStackTrace")。
public State getState():返回線程當前的狀態,這個方法常常被用於監控的目的。
public final ThreadGroup getThreadGroup():返回此線程歸屬的ThreadGroup。
public UncaughtExceptionHandler getUncaughtExceptionHandler():返回此線程的未捕獲異常處理器。若是沒有明確指定,則返回ThreadGroup的處理器(實際上是ThreadGroup,由於ThreadGroup實現了UncaughtExceptionHandler接口)。若是此線程已經終止,則返回null。