成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java多線程之線程的創(chuàng)建、中斷、狀態(tài)與屬性

liangdas / 491人閱讀

摘要:中斷線程當(dāng)線程的方法方法體執(zhí)行完畢自然終止或在方法中出現(xiàn)沒有捕獲的異常時意外終止,線程將終止。如果被中斷線程被阻塞,就無法檢測中斷狀態(tài),就會產(chǎn)生異常。

多進(jìn)程與多線程的本質(zhì)區(qū)別在于:每個進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)。如果需要執(zhí)行一個比較耗時的任務(wù),應(yīng)該使用獨(dú)立的線程。

可以通過實現(xiàn)Runnable接口或繼承Thread類來創(chuàng)建獨(dú)立的線程。

1) 實現(xiàn)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對象,啟動新線程調(diào)用的是start()方法,直接調(diào)用run()方法只會在同一個線程中執(zhí)行任務(wù)。start()會啟動這個線程,引發(fā)調(diào)用run()方法。start()方法會立即返回,并且新線程并行運(yùn)行。

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

中斷線程

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

每個線程都有boolean標(biāo)志的中斷狀態(tài)位,想弄清當(dāng)前線程是否被中斷(中斷狀態(tài)位是否被置位),需要當(dāng)前線程自己判斷。并且,被中斷的線程可以決定如何響應(yīng)中斷。如果被中斷線程被阻塞,就無法檢測中斷狀態(tài),就會產(chǎn)生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
    }
}

當(dāng)產(chǎn)生異常時,有兩種處理方式選擇。

1) 在catch子句中設(shè)置中斷狀態(tài)。

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

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

void mySubTask() throws InterruptedException {}

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

線程狀態(tài)

線程有6種狀態(tài),可以調(diào)用getState()獲取線程狀態(tài)。

New:新創(chuàng)建狀態(tài),在可運(yùn)行前還有些工作要做;

Runnable:可運(yùn)行狀態(tài),可能正在運(yùn)行也可能沒有運(yùn)行,是否運(yùn)行需看操作系統(tǒng)調(diào)度;

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

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

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

Terminated:被終止?fàn)顟B(tài),線程可能由于自然死亡或意外死亡。

線程屬性 線程優(yōu)先級

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

當(dāng)操作系統(tǒng)的線程調(diào)度器有機(jī)會選擇新線程時,會首先選擇擁有較高優(yōu)先級的線程。調(diào)用Thread類的靜態(tài)方法yield()可使當(dāng)前執(zhí)行線程處于讓步狀態(tài),如果有可運(yùn)行的線程優(yōu)先級大于等于此線程,那么這些線程將被調(diào)度。

守護(hù)線程

守護(hù)線程的唯一用途是為其他線程提供服務(wù),通過調(diào)用t.setDaemon(true)將線程轉(zhuǎn)化為守護(hù)線程。如果只剩下守護(hù)線程,虛擬機(jī)就會退出。

注意,守護(hù)線程應(yīng)該永遠(yuǎn)不去訪問固有資源,因為這些操作可能會發(fā)生中斷。

未捕獲異常處理器

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

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
    }
}

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

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65744.html

相關(guān)文章

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

    摘要:在時,引入了包,該包中的大多數(shù)同步器都是基于來構(gòu)建的??蚣芴峁┝艘惶淄ㄓ玫臋C(jī)制來管理同步狀態(tài)阻塞喚醒線程管理等待隊列。指針用于在結(jié)點(diǎn)線程被取消時,讓當(dāng)前結(jié)點(diǎn)的前驅(qū)直接指向當(dāng)前結(jié)點(diǎn)的后驅(qū)完成出隊動作。 showImg(https://segmentfault.com/img/remote/1460000016012438); 本文首發(fā)于一世流云的專欄:https://segmentfau...

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

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

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

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

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

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

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

    摘要:實現(xiàn)接口直接被繼承的子類是程序中的執(zhí)行線程,虛擬機(jī)允許應(yīng)用程序同時運(yùn)行多個執(zhí)行線程。如果要恢復(fù)目標(biāo)線程的線程試圖在調(diào)用之前鎖定此監(jiān)視器,則會導(dǎo)致死鎖。線程可以擁有的最大優(yōu)先級。 Class Thread java.lang.Object java.lang.Thread 實現(xiàn)接口:Runnable直接被繼承的子類:ForkJoinWorkerThread public cl...

    jzzlee 評論0 收藏0

發(fā)表評論

0條評論

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