• Java多線程Thread基礎知識總結

    0
    Java .NET IDE C/C++ 9153 次瀏覽

    什么是線程


            大家都很熟悉操作系統中的多任務:在同一刻運行多個程序的能力。

            多線程程序在較低的層次上擴展了多任務的概念:一個程序同時執行多個任務。通常,每一個任務稱為一個線程,它是線程控制的簡稱。可以同時運行一個以上線程的程序稱為多線程程序。

            多進程和多線程的區別:

            它們本質的區別在于每個進程擁有自己的一整套變量,而線程共享數據。

            在一個單獨的線程中執行一個任務的簡單過程:

    • 將任務代碼移到實現了Runnable接口的類的run方法中。
    public interface Runnable {
        public abstract void run();
    }

    實現一個類:


    public class MyRunnable implements Runnable {
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            task code
        }
    
    }


    • 創建一個類對象:
    Runnable r = new MyRunnable();

    • 由Runnable創建一個Thread對象:
    Thread t = new Thread(r);

    • 啟動線程:
    t.start();

    注意:

             不要調用Thread類或Runnable對象run方法。直接調用run方法,只會執行同一個線程中的任務,而不會啟動新線程。應該調用Thread.start方法。



    中斷線程


           當線程的run方法執行完畢,并執行return語句返回時,或者出現了在方法中沒有捕獲的異常時,線程將終止。


           interrupt方法可以用來請求終止線程。當對一個線程調用interrupt方法時,線程的中斷狀態將被重置。這是每個線程都具有的boolean標志。每個線程都應該不是的檢查這個值,以判斷線程是否被中斷。

           要想檢查線程的中斷狀態,首先調用Thread.currentThread方法獲得當前線程,然后調用isInterrupted方法:

       

    while (!Thread.currentThread().isInterrupted()) {
                work code
            }

           但是,如果線程被阻塞,就無法檢測中斷狀態。當在一個被阻塞的線程(調用sleep或wait)上調用interrupt方法時,就是報InterruptedException異常。



    interrupted和isInterrupted的區別


           Interrupted方法是一個靜態方法,它檢測當前的線程是否被中斷。而且,調用interrupted方法會清除該線程的中斷狀態。另一方面,isInterrupted方法是一個實例方法,可用來檢驗是否有線程被中斷。調用這個方法不會改變中斷狀態。


    InterruptedException異常處理


    • 在catch子句中調用Thread.currentThread().interrupt()來設置中斷狀態,讓調用者可以對它進行檢查。
    void mySubTask() {
            // ...
            try {
                sleep(delay);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            // ...
        }

    • 或者,更好的方式是用throws InterruptedException,不采用try catch 語句捕獲異常。讓調用者捕獲異常。
    void mySubTask() throws InterruptedException{
            // ...
            sleep(delay);
            // ...
        }

    線程狀態


    線程可以有6中狀態:(獲取當前狀態,可調用getState方法)

    • New (新創建)
    • Runnable(可運行)
    • Blocked (被阻塞)
    • Waiting (等待)
    • Timed waiting (計時等待)
    • Terminated (被終止)

    新創建線程


          當用new創建一個新線程是,如 new Thread(r),該線程還沒有開始運行。這意味著它的狀態是new。當一個線程處于新創建狀態時,程序還沒有開始運行線程中的代碼。



    可運行線程



             一旦調用start方法,線程處于runnable狀態。一旦線程開始運行,它不必始終保持運行。事實上,運行中的線程被中斷,目的是為了讓其他線程獲得運行機會。在任何時候,一個可運行的線程可能正在運行也可能沒有運行,所以說這個狀態被稱作可運行而不是運行。



    被阻塞線程和等待線程



             當線程處于被阻塞或等待狀態時,它暫時不活動,它不運行代碼并且只消耗最少的資源,直到線程調度器重新激活它。

    • 當一個線程試圖獲取一個內部的對象鎖,而該鎖被其他線程持有,則該線程進入阻塞狀態。
    • 當線程等待另一個線程通知調度器一個條件時,它自己進入等待狀態。(如Thread.join 或 Object.wait)
    • 有幾個方法有一個超時參數,調用它們會導致線程進入計時等待狀態。(如Thread.sleep,Thread.join,和 Object.wait 等)




    被終止的線程


           線程被終止的原因:


    • 因為run方法執行完畢,正常退出而自然死亡。
    • 或者因為一個沒有捕獲的異常終止了run方法,意外死亡。
          可以調用stop方法殺死一個線程。但是,stop方法已經過時,不要在代碼中調用這個方法。



    來自: http://blog.csdn.net/qq710262350/article/details/43024955

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色