国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java多線程之線程的創建、中斷、狀態與屬性

liangdas / 494人閱讀

摘要:中斷線程當線程的方法方法體執行完畢自然終止或在方法中出現沒有捕獲的異常時意外終止,線程將終止。如果被中斷線程被阻塞,就無法檢測中斷狀態,就會產生異常。

多進程與多線程的本質區別在于:每個進程擁有自己的一整套變量,而線程則共享數據。如果需要執行一個比較耗時的任務,應該使用獨立的線程。

可以通過實現Runnable接口或繼承Thread類來創建獨立的線程。

1) 實現Ruannable接口

class MyRunnable implements Runnable {
    public void run() {
        task code
    }
}
Ruannable r = new MyRuannable();
Thread t = new Thread(r);
t.start();

2) 繼承Thread

class MyThread extends Thread {
    public void run() {
        task code
    }
}
Thread t = new MyThread();
t.start();

對于Thread類或Runnable對象,啟動新線程調用的是start()方法,直接調用run()方法只會在同一個線程中執行任務。start()會啟動這個線程,引發調用run()方法。start()方法會立即返回,并且新線程并行運行。

如果有很多任務,為每個任務創建一個獨立的線程付出的代價太大,可以使用線程池來解決這個問題。

中斷線程

當線程的run()方法方法體執行完畢(自然終止)或在方法中出現沒有捕獲的異常時(意外終止),線程將終止。另外,可以使用interrupt()方法發送中斷請求強制線程終止。

每個線程都有boolean標志的中斷狀態位,想弄清當前線程是否被中斷(中斷狀態位是否被置位),需要當前線程自己判斷。并且,被中斷的線程可以決定如何響應中斷。如果被中斷線程被阻塞,就無法檢測中斷狀態,就會產生InterruptedException異常。

public void run() {
    try {
        do some work
        while(! Thread.currentThread().isInterrupted() && more work to do) {
            do more work
        }
    } catch(InterruptedException e) {
        // thread was interrupted during sleep or wait (in blocked)
    } finally {
        cleanup if required
    }
}

當產生異常時,有兩種處理方式選擇。

1) 在catch子句中設置中斷狀態。

catch(InterruptedException e) {
    Thread.currentThread().interrupt();
}

2) 不采用try語句塊捕獲異常,交給調用者處理。

void mySubTask() throws InterruptedException {}

測試當前線程是否被中斷有interrupted()isInterrupted()兩個方法。
interrupted()是一個靜態方法,有副作用,會把中斷狀態位置為false
isInterrupted()是一個實例方法,無副作用。

線程狀態

線程有6種狀態,可以調用getState()獲取線程狀態。

New:新創建狀態,在可運行前還有些工作要做;

Runnable:可運行狀態,可能正在運行也可能沒有運行,是否運行需看操作系統調度;

Blocked:被阻塞狀態,不活動,可能由于請求鎖失敗;

Waiting:等待狀態,不活動,等待通知,比如調用Thread.join()方法;

Timed Waiting:計時等待狀態,不活動,等待超時或通知,比如調用Thread.sleep(long millis)join(long millis)方法;

Terminated:被終止狀態,線程可能由于自然死亡或意外死亡。

線程屬性 線程優先級

每一個線程都有一個優先級,默認繼承父線程。注意,不要將程序功能的正確性依賴于優先級。可以通過setPriority(int newPriority)方法設置線程優先級,最小優先級MIN_PRIORITY為1,默認優先級NORM_PRIORITY為5,最高優先級MAX_PRIORITY為10。

當操作系統的線程調度器有機會選擇新線程時,會首先選擇擁有較高優先級的線程。調用Thread類的靜態方法yield()可使當前執行線程處于讓步狀態,如果有可運行的線程優先級大于等于此線程,那么這些線程將被調度。

守護線程

守護線程的唯一用途是為其他線程提供服務,通過調用t.setDaemon(true)將線程轉化為守護線程。如果只剩下守護線程,虛擬機就會退出。

注意,守護線程應該永遠不去訪問固有資源,因為這些操作可能會發生中斷。

未捕獲異常處理器

線程的run()方法不能拋出任何被檢測的異常,但可能會拋出不被檢測的異常,導致線程終止。就在線程死亡之前,異常被傳遞到未捕獲異常處理器,進行處理,比如使用日志API發送異常到日志文件。

class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
    void uncaughtException(Thread t, Throwable e) {
        // t - terminated thread without exception catch
        // e - uncaught exception object
        do something like send exception info to log file
    }
}

為線程設置處理器可通過方法setUncaughtExceptionHandler()或靜態方法setDefaultUncaughtExceptionHandler()完成。如果不設置未捕獲異常處理器,那么默認處理器為空。

方法getUncaughtExceptionHandler()用于獲取未捕獲異常處理器,但是有副作用,如果返回值為空,那么就會將ThreadGroup對象設置為處理器。線程組ThreadGroup對象的執行流大致如下:

if(該線程組有父線程組) {
    父線程組的uncaughtException方法被調用
} else {
    if(Thread.getDefaultExceptionHandler()返回非空處理器) {
        調用該處理器
    } else {
        if(Throwable是ThreadDeath的一個實例) {
            // 由過時方法stop產生
            什么都不做
        } else {
            輸出棧蹤跡到標準錯誤流
        }
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65744.html

相關文章

  • Java線程進階(六)—— J.U.Clocks框架:AQS綜述(1)

    摘要:在時,引入了包,該包中的大多數同步器都是基于來構建的。框架提供了一套通用的機制來管理同步狀態阻塞喚醒線程管理等待隊列。指針用于在結點線程被取消時,讓當前結點的前驅直接指向當前結點的后驅完成出隊動作。 showImg(https://segmentfault.com/img/remote/1460000016012438); 本文首發于一世流云的專欄:https://segmentfau...

    cocopeak 評論0 收藏0
  • (一)java線程Thread

    摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載類學習線程的開發者首先遇到的第一個類就是通過使用類我們就可以啟動停止中斷一個線程在同一個時間片里可能會有多個線程在執行每個線程都擁有它自己的方法調用堆棧參數和變量每個至少會有 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    boredream 評論0 收藏0
  • Java 線程核心技術梳理(附源碼)

    摘要:本文對多線程基礎知識進行梳理,主要包括多線程的基本使用,對象及變量的并發訪問,線程間通信,的使用,定時器,單例模式,以及線程狀態與線程組。源碼采用構建,多線程這部分源碼位于模塊中。通知可能等待該對象的對象鎖的其他線程。 本文對多線程基礎知識進行梳理,主要包括多線程的基本使用,對象及變量的并發訪問,線程間通信,lock的使用,定時器,單例模式,以及線程狀態與線程組。 寫在前面 花了一周時...

    Winer 評論0 收藏0
  • Java線程筆記(一):JMM基礎關鍵字

    摘要:當線程執行完后進入狀態,表示線程執行結束。其中和表示兩個線程。但要注意,讓出并不表示當前線程不執行了。關鍵字其作用是防止指令重排和使線程對一個對象的修改令其他線程可見。 JMM特性一覽 Java Memory Model的關鍵技術點都是圍繞著多線程的原子性、可見性和有序性來建立的。因此我們首先需要來了解這些概念。 原子性(Atomicity) 原子性是指一個操作是不可中斷的。即使是在多...

    cyixlq 評論0 收藏0
  • java線程Thread類

    摘要:實現接口直接被繼承的子類是程序中的執行線程,虛擬機允許應用程序同時運行多個執行線程。如果要恢復目標線程的線程試圖在調用之前鎖定此監視器,則會導致死鎖。線程可以擁有的最大優先級。 Class Thread java.lang.Object java.lang.Thread 實現接口:Runnable直接被繼承的子類:ForkJoinWorkerThread public cl...

    jzzlee 評論0 收藏0

發表評論

0條評論

liangdas

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<