国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Java教程 - 淺談Java線程Thread之interrupt中斷解析

淺談Java線程Thread之interrupt中斷解析

2021-03-28 15:57Ihesong Java教程

這篇文章主要介紹了Java線程Thread之interrupt中斷解析,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

這一篇我們說說java線程thread的interrupt中斷機制。

中斷線程

線程的thread.interrupt()方法是中斷線程,將會設置該線程的中斷狀態位,即設置為true,中斷的結果線程是死亡、還是等待新的任務或是繼續運行至下一步,就取決于這個程序本身。線程會不時地檢測這個中斷標示位,以判斷線程是否應該被中斷(中斷標示值是否為true)。它并不像stop方法那樣會中斷一個正在運行的線程。

判斷線程是否被中斷

判斷某個線程是否已被發送過中斷請求,請使用thread.currentthread().isinterrupted()方法(因為它將線程中斷標示位設置為true后,不會立刻清除中斷標示位,即不會將中斷標設置為false),而不要使用thread.interrupted()(該方法調用后會將中斷標示位清除,即重新設置為false)方法來判斷,下面是線程在循環中時的中斷方式:

?
1
2
3
while(!thread.currentthread().isinterrupted() && more work to do){
 do more work
}

interrupt之中斷狀態標記

interrupt中斷機制中有如下方法:

  1. thread.interrupt(),設置當前中斷標記為true(類似屬性的set方法)
  2. thread.isinterrupted(),檢測當前的中斷標記(類似屬性的get方法)
  3. thread.interrupted(),檢測當前的中斷標記,然后重置中斷標記為false(類似屬性的get方法+set方法)

因此interrupt中斷機制并不是真正的將當前線程中斷,而是一個中斷標記的變化。我們先用例子來測試一下。

?
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
32
33
34
35
36
37
38
39
40
41
42
43
44
public class interrupttest {
 //這里用來打印消耗的時間
 private static long time = 0;
 private static void resettime(){
 time = system.currenttimemillis();
 }
 private static void printcontent(string content){
 system.out.println(content + "  時間:" + (system.currenttimemillis() - time));
 }
 
 public static void main(string[] args) {
 test1();
 }
 
 private static void test1(){
 thread1 thread1 = new thread1();
 thread1.start();
 //延時3秒后interrupt中斷
 try {
  thread.sleep(3000);
 } catch (interruptedexception e) {
  e.printstacktrace();
 }
 thread1.interrupt();
 printcontent("執行中斷");
 }
 
 private static class thread1 extends thread{
 @override public void run() {
  resettime();
  int num = 0;
  while (true){
  if(isinterrupted()){
   printcontent("當前線程 isinterrupted");
   break;
  }
  num++;
  if(num % 100 == 0){
   printcontent("num : " + num);
  }
  }
 }
 }
}

以上代碼是開啟一個thread1線程,在thread1線程的while循環中不斷對num加1,每到100的倍數打印一次(防止打印太快)。然后主線程在sleep了3000毫秒后,調用thread1線程的interrupt方法。那么我們看看輸出結果:

淺談Java線程Thread之interrupt中斷解析

intterupt中斷

可以看到,在耗時3000毫秒左右,也就是主線程sleep之后執行thread1.interrupt();后,thread1線程停止了,而thread1線程的停止是因為while循環中的isinterrupted方法返回了true,所以break退出了while循環,也就是說interrupt和isinterrupted在這里起到的作用就相當于setxx和getxx的作用,維護著一個boolean變量。

interrupt之中斷異常處理

當然interrupt機制并不僅僅是一個中斷狀態位的變化和檢測,它還可以進行中斷異常的處理。我們知道thread.sleep()方法需要捕獲中斷異常,那接下來我們往其中添加一個sleep延時試試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while (true){
if(isinterrupted()){
 printcontent("當前線程 isinterrupted");
 break;
}
num++;
//sleep一下
try {
 thread.sleep(1);
} catch (interruptedexception e) {
 e.printstacktrace();
}
 
if(num % 100 == 0){
 printcontent("num : " + num);
}
}

我們再看看輸出結果:

淺談Java線程Thread之interrupt中斷解析

intterupt中斷

這里我們會發現,sleep睡眠之后,輸出的num值明顯小了好多(沒睡眠時num都達到10億的大小了,看來cpu執行簡單運算還是非常快的),哈哈,不過這不是重點,重點是是看到輸出了一個異常,還有就是輸出異常后,isinterrupted輸出返回false,thread1線程又繼續執行下去了,并沒有退出while循環。那么這是為什么呢?我們只是加了一個sleep睡眠而已。

如果thread1線程中有執行需要捕獲interruptedexception異常的操作,比如thread的sleep,join方法,object的wait,condition的await等,它是強制需要捕獲interruptedexception異常的,那么當thread1.interrupt方法調用之后,它會給thread1線程拋出一個interruptedexception異常,那么在while循環中,就能捕獲到這個異常然后這個異常拋出之后,又會馬上將線程中斷標識重置為false,因此在下次的while循環中判斷isinterrupted時,它是false,也就不會break,然后while循環會一直執行下去。

因此interrupt()方法會根據thread線程中的run方法里是否有必須捕獲interruptedexception異常的代碼,而做出不同操作:

  1. 如果沒有必須捕獲interruptedexception異常的代碼(比如thread.sleep()),則isinterrupted()會返回true,此時可以在isinterrupted的判斷中處理中斷變化。
  2. 如果有必須捕獲interruptedexception異常的代碼(比如thread.sleep()),則會拋出interruptedexception異常,并進行捕獲,同時重置isinterrupted為false,此時得在異常捕獲中處理中斷變化。

interrupt的應用場景

通常interrupt適用于在線程執行中的循環標記判斷,例如

?
1
2
3
while(!isinterrupted()){
 ...
}

但是如果在本次循環中出現阻塞了,那么線程就無法判斷下次的isinterrupted標記,那么即便調用了interrupt()方法也無法退出循環,也就無法退出線程。例如

?
1
2
3
4
5
6
while(!isinterrupted()){
 ...
 while(true){
  //線程卡在這里了,則無法響應interrupte機制了
 }
}

這樣的話,interrupt就沒轍了,線程會一直執行下去,不會被中斷停止。

測試例子查看 我的github--javatest

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/7f1071293a18

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 蜜桃tv一区二区三区 | 午夜在线观看影院 | 欧美a级片在线观看 | 国内精品视频一区二区三区八戒 | 亚洲黄色成人av | www.久久.com| 中文在线资源 | 日韩中文字幕一区二区三区 | 日韩欧一区二区三区 | 日韩一级视频 | 久草.com| 亚洲高清一区二区三区 | 亚洲一区三区 | 国产日韩欧美三级 | 一本大道综合伊人精品热热 | 综合色导航 | 桃色视频在线播放 | 精品久久久久久久久久久久 | 黄色在线免费看 | 无码一区二区三区视频 | 国产特级毛片aaaaaa高清 | av在线天堂| 午夜电影av | 免费成人在线电影 | 日韩在线视频观看免费 | 国产激情视频 | 国产精品福利电影网 | 国产高清在线精品一区二区三区 | 亚洲精品一区二区三区在线播放 | 国产欧美高清在线观看 | 国产一区久久久 | 伊人久久艹 | 亚洲成人av在线 | 国产乱码久久久久久一区二区 | 一区免费看 | 亚洲九九 | 成人在线免费电影 | 久久精品成人 | 人人爽人人爽人人片av | 国产综合亚洲精品一区二 | 在线国产一区二区 |