亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

liangdas / 562人閱讀

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

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

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

1) 實(shí)現(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();

對(duì)于Thread類或Runnable對(duì)象,啟動(dòng)新線程調(diào)用的是start()方法,直接調(diào)用run()方法只會(huì)在同一個(gè)線程中執(zhí)行任務(wù)。start()會(huì)啟動(dòng)這個(gè)線程,引發(fā)調(diào)用run()方法。start()方法會(huì)立即返回,并且新線程并行運(yùn)行。

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

中斷線程

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

每個(gè)線程都有boolean標(biāo)志的中斷狀態(tài)位,想弄清當(dāng)前線程是否被中斷(中斷狀態(tài)位是否被置位),需要當(dāng)前線程自己判斷。并且,被中斷的線程可以決定如何響應(yīng)中斷。如果被中斷線程被阻塞,就無法檢測(cè)中斷狀態(tài),就會(huì)產(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)生異常時(shí),有兩種處理方式選擇。

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

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

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

void mySubTask() throws InterruptedException {}

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

線程狀態(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),不活動(dòng),可能由于請(qǐng)求鎖失?。?/p>

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

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

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

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

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

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

守護(hù)線程

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

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

未捕獲異常處理器

線程的run()方法不能拋出任何被檢測(cè)的異常,但可能會(huì)拋出不被檢測(cè)的異常,導(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()用于獲取未捕獲異常處理器,但是有副作用,如果返回值為空,那么就會(huì)將ThreadGroup對(duì)象設(shè)置為處理器。線程組ThreadGroup對(duì)象的執(zhí)行流大致如下:

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/65744.html

相關(guān)文章

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

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

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

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

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

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

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

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

    cyixlq 評(píng)論0 收藏0
  • java線程Thread類

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

    jzzlee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<