激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java高并發(fā)的線程中斷的幾種方式詳解

java高并發(fā)的線程中斷的幾種方式詳解

2022-03-02 00:54路人甲Java Java教程

這篇文章主要介紹了Java線程中斷機(jī)制幾種方法及示例,向大家分享了這幾種方法的介紹幾代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。

通過一個(gè)變量控制線程中斷

代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.itsoku.chat05; 
import java.util.concurrent.TimeUnit;  
/**
 * 微信公眾號(hào):路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請(qǐng)關(guān)注!   
 */
public class Demo1 {   
    public volatile static boolean exit = false;   
    public static class T extends Thread { 
        @Override  
        public void run() {
            while (true) { 
                //循環(huán)處理業(yè)務(wù)   
                if (exit) {
                    break
                }  
            }  
        }  
    }  
    public static void setExit() { 
        exit = true;   
    }  
    public static void main(String[] args) throws InterruptedException {   
        T t = new T(); 
        t.start(); 
        TimeUnit.SECONDS.sleep(3); 
        setExit(); 
    }  
}

代碼中啟動(dòng)了一個(gè)線程,線程的run方法中有個(gè)死循環(huán),內(nèi)部通過exit變量的值來控制是否退出。 TimeUnit.SECONDS.sleep(3);讓主線程休眠3秒,此處為什么使用TimeUnit?TimeUnit使用更方便一些,能夠很清晰的控制休眠時(shí)間,底層還是轉(zhuǎn)換為Thread.sleep實(shí)現(xiàn)的。程序有個(gè)重點(diǎn):volatile關(guān)鍵字,exit變量必須通過這個(gè)修飾,如果把這個(gè)去掉,程序無法正常退出。volatile控制了變量在多線程中的可見性,關(guān)于volatile前面的文章中有介紹,此處就不再說了。

通過線程自帶的中斷標(biāo)志控制

示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.itsoku.chat05; 
import java.util.concurrent.TimeUnit;  
/**
 * 微信公眾號(hào):路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請(qǐng)關(guān)注!   
 */
public class Demo2 {   
    public static class T extends Thread { 
        @Override  
        public void run() {
            while (true) { 
                //循環(huán)處理業(yè)務(wù)   
                if (this.isInterrupted()) {
                    break
                }  
            }  
        }  
    }  
    public static void main(String[] args) throws InterruptedException {   
        T t = new T(); 
        t.start(); 
        TimeUnit.SECONDS.sleep(3); 
        t.interrupt(); 
    }  
}

運(yùn)行上面的程序,程序可以正常結(jié)束。線程內(nèi)部有個(gè)中斷標(biāo)志,當(dāng)調(diào)用線程的interrupt()實(shí)例方法之后,線程的中斷標(biāo)志會(huì)被置為true,可以通過線程的實(shí)例方法isInterrupted()獲取線程的中斷標(biāo)志。

線程阻塞狀態(tài)中如何中斷?

示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.itsoku.chat05; 
import java.util.concurrent.TimeUnit;  
/**
 * 微信公眾號(hào):路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請(qǐng)關(guān)注!   
 */
public class Demo3 {   
    public static class T extends Thread { 
        @Override  
        public void run() {
            while (true) { 
                //循環(huán)處理業(yè)務(wù)   
                //下面模擬阻塞代碼 
                try {  
                    TimeUnit.SECONDS.sleep(1000);  
                } catch (InterruptedException e) { 
                    e.printStackTrace();   
                }  
            }  
        }  
    }  
    public static void main(String[] args) throws InterruptedException {   
        T t = new T(); 
        t.start(); 
    }  
}

運(yùn)行上面代碼,發(fā)現(xiàn)程序無法結(jié)束。

在此先補(bǔ)充幾點(diǎn)知識(shí):

1.調(diào)用線程的interrupt()實(shí)例方法,線程的中斷標(biāo)志會(huì)被置為true

2.當(dāng)線程處于阻塞狀態(tài)時(shí),調(diào)用線程的interrupt()實(shí)例方法,線程內(nèi)部會(huì)觸發(fā)InterruptedException異常,并且會(huì)清除線程內(nèi)部的中斷標(biāo)志(即將中斷標(biāo)志置為false)

那么上面代碼可以調(diào)用線程的interrupt()方法來引發(fā)InterruptedException異常,來中斷sleep方法導(dǎo)致的阻塞,調(diào)整一下代碼,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.itsoku.chat05; 
import java.util.concurrent.TimeUnit;  
/**
 * 微信公眾號(hào):路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請(qǐng)關(guān)注!   
 */
public class Demo3 {   
    public static class T extends Thread { 
        @Override  
        public void run() {
            while (true) { 
                //循環(huán)處理業(yè)務(wù)   
                //下面模擬阻塞代碼 
                try {  
                    TimeUnit.SECONDS.sleep(1000);  
                } catch (InterruptedException e) { 
                    e.printStackTrace();   
                    this.interrupt();  
                }  
                if (this.isInterrupted()) {
                    break
                }  
            }  
        }  
    }  
    public static void main(String[] args) throws InterruptedException {   
        T t = new T(); 
        t.start(); 
        TimeUnit.SECONDS.sleep(3); 
        t.interrupt(); 
    }  
}

運(yùn)行結(jié)果:

?
1
2
3
4
5
java.lang.InterruptedException: sleep interrupted  
    at java.lang.Thread.sleep(Native Method)   
    at java.lang.Thread.sleep(Thread.java:340
    at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)  
    at com.itsoku.chat05.Demo3$T.run(Demo3.java:17)

程序可以正常結(jié)束了,分析一下上面代碼,注意幾點(diǎn):

1.main方法中調(diào)用了t.interrupt()方法,此時(shí)線程t內(nèi)部的中斷標(biāo)志會(huì)置為true

2.然后會(huì)觸發(fā)run()方法內(nèi)部的InterruptedException異常,所以運(yùn)行結(jié)果中有異常輸出,上面說了,當(dāng)觸發(fā)InterruptedException異常時(shí)候,線程內(nèi)部的中斷標(biāo)志又會(huì)被清除(變?yōu)閒alse),所以在catch中又調(diào)用了this.interrupt();一次,將中斷標(biāo)志置為false

3.run()方法中通過this.isInterrupted()來獲取線程的中斷標(biāo)志,退出循環(huán)(break)

總結(jié)

當(dāng)一個(gè)線程處于被阻塞狀態(tài)或者試圖執(zhí)行一個(gè)阻塞操作時(shí),可以使用 Thread.interrupt()方式中斷該線程,注意此時(shí)將會(huì)拋出一個(gè)InterruptedException的異常,同時(shí)中斷狀態(tài)將會(huì)被復(fù)位(由中斷狀態(tài)改為非中斷狀態(tài))

內(nèi)部有循環(huán)體,可以通過一個(gè)變量來作為一個(gè)信號(hào)控制線程是否中斷,注意變量需要volatile修飾

文中的幾種方式可以結(jié)合起來靈活使用控制線程的中斷

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!

原文鏈接:https://itsoku.blog.csdn.net/article/details/100036221

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 俄罗斯16一20sex牲色另类 | 中文字幕免费在线看 | 国产一级做a爰片在线看 | 久久影院国产精品 | 精品久久久久久久久久久aⅴ | 色综合视频 | 在线成人精品视频 | 国产精品一区二区x88av | 成人午夜免费观看 | 成人免费毛片片v | 国产精品jk白丝蜜臀av软件 | 羞羞视频免费观看入口 | 成人性生活视频 | 日韩黄色免费在线观看 | 成人福利视频在线观看 | japanese xxxxhd | 久久精品中文字幕一区 | 在线成人免费av | 欧美一区公司 | 免费毛片儿 | 国产精品伊人久久 | 特色一级黄色片 | 激情视频在线播放 | 国产视频在线播放 | 91看片免费看 | 亚洲91网站 | 国产午夜精品一区二区三区视频 | 黄色av一区二区三区 | 91 在线| 蜜桃精品视频 | 91精品久久久久久久久久久 | 亚洲精品aⅴ中文字幕乱码 中文字幕欧美在线 | www噜噜偷拍在线视频 | 天天夜夜操操 | aa国产视频一区二区 | 欧美一级黄色网 | 成人在线第一页 | 欧美成人自拍 | 成人爱爱电影 | 九九热精品在线 | av在线观|