最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程中的Interrupt簡(jiǎn)析

 更新時(shí)間:2023年09月25日 11:31:51   作者:HengTian_real  
這篇文章主要介紹了Java多線程中的Interrupt簡(jiǎn)析,Interrupt 的其作用是"中斷"線程, 但實(shí)際上線程仍會(huì)繼續(xù)運(yùn)行, 這是一個(gè)非常容易混淆的概念,Interrupt 的真正作用是給線程對(duì)象設(shè)置一個(gè)中斷標(biāo)記, 并不會(huì)影響線程的正常運(yùn)行,需要的朋友可以參考下

Interrupt系列

在調(diào)用如下方法進(jìn)行阻塞的線程,都可以調(diào)用該線程的interrupt()方法打斷其阻塞

  • Object的wait方法
  • Thread的sleep方法
  • Thread的join方法
  • InterruptibleChannel的io操作
  • Selector的wakeup方法

上述方法統(tǒng)稱為可中斷方法,實(shí)際上,能拋出InterruptedException異常的方法都是可中斷方法

interrupt()方法

//源碼
public void interrupt() {
    if (this != Thread.currentThread())
        checkAccess();
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
	}
	interrupt0();
}

當(dāng)一個(gè)線程被別的線程調(diào)用它的阻塞方法時(shí),它會(huì)調(diào)用interrupt0()設(shè)置一個(gè)中斷標(biāo)識(shí),如果被interrupt的線程正在阻塞狀態(tài),該線程的阻塞狀態(tài)會(huì)被中斷并且中斷標(biāo)識(shí)被清除,如例一

//例一
package online.hengtian.Thread;
import java.util.concurrent.TimeUnit;
public class InterruptDemo {
    public static void main(String[] args){
        Thread t1=new Thread(()->{
            int i=0;
            while(i<5){
                System.out.println(i+" : 我當(dāng)前的中斷狀態(tài)"+Thread.currentThread().isInterrupted());
                try {
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(i+" : 我沒被中斷");
                } catch (InterruptedException e) {
                    System.out.println("我被中斷了");
                    System.out.println(i+" : 此時(shí)我的中斷狀態(tài)是"+Thread.currentThread().isInterrupted());
                }
                i++;
            }
        });
        t1.start();
        t1.interrupt();
    }
}

輸出

0 : 我當(dāng)前的中斷狀態(tài)true
我被中斷了
0 : 此時(shí)我的中斷狀態(tài)是false
1 : 我當(dāng)前的中斷狀態(tài)false
1 : 我沒被中斷
2 : 我當(dāng)前的中斷狀態(tài)false
2 : 我沒被中斷
3 : 我當(dāng)前的中斷狀態(tài)false
3 : 我沒被中斷
4 : 我當(dāng)前的中斷狀態(tài)false
4 : 我沒被中斷

如果被interrupt的線程并沒有進(jìn)入阻塞狀態(tài),該線程在進(jìn)入阻塞狀態(tài)后會(huì)立即被中斷,然后清除中斷狀態(tài),測(cè)試如下:

//當(dāng)線程被interrupt之后才會(huì)進(jìn)入sleep方法
package online.hengtian.Thread;
import java.util.concurrent.TimeUnit;
public class InterruptDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(()->{
            //changed beginning
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("我當(dāng)前沒被中斷");
            }
            //changed end
            int i=0;
            while(i<5){
                System.out.println(i+" : 我當(dāng)前的中斷狀態(tài)"+Thread.currentThread().isInterrupted());
                try {
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(i+" : 我沒被中斷");
                } catch (InterruptedException e) {
                    System.out.println("我被中斷了");
                    System.out.println(i+" : 此時(shí)我的中斷狀態(tài)是"+Thread.currentThread().isInterrupted());
                }
                i++;
            }
        });
        t1.start();
        TimeUnit.SECONDS.sleep(2);
        t1.interrupt();
    }
}

截取部分輸出如下

我當(dāng)前沒被中斷
我當(dāng)前沒被中斷
我當(dāng)前沒被中斷
我當(dāng)前沒被中斷
我當(dāng)前沒被中斷
我當(dāng)前沒被中斷
我當(dāng)前沒被中斷
我當(dāng)前沒被中斷
0 : 我當(dāng)前的中斷狀態(tài)true
我被中斷了
0 : 此時(shí)我的中斷狀態(tài)是false
1 : 我當(dāng)前的中斷狀態(tài)false
1 : 我沒被中斷
2 : 我當(dāng)前的中斷狀態(tài)false
2 : 我沒被中斷
3 : 我當(dāng)前的中斷狀態(tài)false
3 : 我沒被中斷
4 : 我當(dāng)前的中斷狀態(tài)false
4 : 我沒被中斷

當(dāng)理解了interrupt方法中斷的根本原因是中斷標(biāo)識(shí)之后,一切都會(huì)變的很簡(jiǎn)單

到此這篇關(guān)于Java多線程中的Interrupt簡(jiǎn)析的文章就介紹到這了,更多相關(guān)Java的Interrupt內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式

    SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式

    定時(shí)任務(wù)在我們項(xiàng)目開發(fā)中也是很重要的,對(duì)于某些場(chǎng)景必須要用定時(shí)任務(wù)?,如定時(shí)發(fā)送郵件啊,定時(shí)統(tǒng)計(jì)數(shù)據(jù)等,這篇文章主要講講項(xiàng)目中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式,需要的朋友可以參考下
    2023-05-05
  • Java使用Flyway實(shí)現(xiàn)數(shù)據(jù)庫版本控制的技術(shù)指南

    Java使用Flyway實(shí)現(xiàn)數(shù)據(jù)庫版本控制的技術(shù)指南

    在現(xiàn)代應(yīng)用開發(fā)中,數(shù)據(jù)庫結(jié)構(gòu)經(jīng)常隨著業(yè)務(wù)需求不斷演變,使用手動(dòng)SQL腳本管理數(shù)據(jù)庫版本,不僅容易出現(xiàn)錯(cuò)誤,還難以跟蹤和回滾,Flyway是一個(gè)強(qiáng)大的數(shù)據(jù)庫遷移工具,能夠幫助開發(fā)者高效管理和自動(dòng)化數(shù)據(jù)庫的版本控制,本文將介紹Flyway的基本功能及其在SpringBoot項(xiàng)目中的實(shí)踐
    2025-02-02
  • Spring Boot自定義配置屬性源(PropertySource)

    Spring Boot自定義配置屬性源(PropertySource)

    這篇文章主要介紹了Spring Boot自定義配置屬性源(PropertySource),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java中Runnable和Callable的區(qū)別和聯(lián)系及使用場(chǎng)景

    Java中Runnable和Callable的區(qū)別和聯(lián)系及使用場(chǎng)景

    Java多線程有兩個(gè)重要的接口,Runnable和Callable,分別提供一個(gè)run方法和call方法,二者是有較大差異的,本文介紹Java中Runnable和Callable的區(qū)別和聯(lián)系及使用場(chǎng)景,感興趣的朋友一起看看吧
    2025-03-03
  • 利用Java實(shí)現(xiàn)解析網(wǎng)頁中的內(nèi)容

    利用Java實(shí)現(xiàn)解析網(wǎng)頁中的內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言做一個(gè)解析指定網(wǎng)址的網(wǎng)頁內(nèi)容小應(yīng)用,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以嘗試下
    2022-10-10
  • Java java.lang.InstantiationException異常案例詳解

    Java java.lang.InstantiationException異常案例詳解

    這篇文章主要介紹了Java java.lang.InstantiationException異常案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • mybatisplus如何根據(jù)不同ID批量更新

    mybatisplus如何根據(jù)不同ID批量更新

    本文介紹了MyBatis-Plus中使用Wrapper批量更新數(shù)據(jù)的方法,包括使用UpdateWrapper批量更新相同屬性值、根據(jù)ID數(shù)組批量更新相同屬性值,以及使用updateBatchById方法批量更新多個(gè)屬性值,提供了示例代碼和注意事項(xiàng)
    2026-04-04
  • Java的stream流多個(gè)字段排序的實(shí)現(xiàn)

    Java的stream流多個(gè)字段排序的實(shí)現(xiàn)

    本文主要介紹了Java的stream流多個(gè)字段排序的實(shí)現(xiàn),主要是兩種方法,第一種是固定多個(gè)字段排序和第二種動(dòng)態(tài)字段進(jìn)行排序,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 解決scala.collection.mutable.Map寫入的問題

    解決scala.collection.mutable.Map寫入的問題

    這篇文章主要介紹了解決scala.collection.mutable.Map寫入的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 原來Java中有兩個(gè)ArrayList

    原來Java中有兩個(gè)ArrayList

    原來Java中有兩個(gè)ArrayList,本文就帶著大家一起探究Java中的ArrayList,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評(píng)論

南京市| 湖南省| 宁南县| 福泉市| 宝坻区| 二手房| 扶沟县| 青海省| 彭州市| 津市市| 高雄县| 沙田区| 门头沟区| 聂拉木县| 延津县| 博罗县| 虞城县| 阜宁县| 马鞍山市| 盐边县| 吉林市| 新宾| 壤塘县| 镇坪县| 华宁县| 土默特左旗| 辽源市| 赣州市| 和政县| 建阳市| 太康县| 兴国县| 枞阳县| 焦作市| 莱西市| 乌兰察布市| 都江堰市| 喜德县| 泾阳县| 柏乡县| 根河市|