併發學習筆記(3)

雖是讀書筆記,可是如轉載請註明出處 http://segmentfault.com/blog/exploring/
.. 拒絕伸手複製黨java


Thread 線程的幾種狀態

線程具備新建、可運行、阻塞、等待、定時等待、死亡六種。線程的狀態徹底包含了一個線程重新建到運行,最後到結束的整個生命週期,數據庫

clipboard.png

線程狀態的具體信息以下: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庫中的LockCondition時,就會進入等待狀態線程

好比一個線程調用了某個對象的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;
    }

clipboard.png

線程的屬性

線程的屬性:線程優先級,守護線程,線程組以及處理未捕獲異常的處理器。

線程優先級

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方法不能跑出任何被檢測的異常,可是不被檢測的異常會致使線程終止,這種狀況,線程就死亡了。

相關文章
相關標籤/搜索