一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務(wù)器之家 - 編程語言 - Java教程 - java多線程中斷代碼詳解

java多線程中斷代碼詳解

2021-02-02 11:27June的專欄 Java教程

這篇文章主要介紹了java多線程中斷代碼詳解,具有一定參考價值,需要的朋友可以了解下。

一、java中終止線程主要有三種方法:

①線程正常退出,即run()方法執(zhí)行完畢了

②使用Thread類中的stop()(已過期不推薦使用)方法強行終止線程。

③使用中斷機制

t.stop()調(diào)用時,終止線程,會導(dǎo)致該線程所持有的鎖被強制釋放,從而被其他線程所持有,因此有可能導(dǎo)致與預(yù)期結(jié)果不一致。下面使用中斷信號量中斷非阻塞狀態(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
26
27
28
29
30
31
32
33
34
public class TestStopThread {
  public static void main(String[] args) throws InterruptedException {
    StopThread st = new StopThread();
    st.setName("線程st");
    st.start();
    Thread.sleep(3000);
    st.stopFlag();
    Thread.sleep(1000);
    System.out.println(st.getState());
  }
}
class StopThread extends Thread {
  // 此變量必須加上volatile
  private volatile boolean stop = false;
  @Override
  public void run() {
    // 判斷線程體是否運行
    while (!stop) {
      System.out.println("線程StopThread正在運行");
      long time = System.currentTimeMillis();
      /*
       * 使用while循環(huán)模擬 sleep 方法,這里不要使用sleep,否則在阻塞時會拋
       * InterruptedException異常而退出循環(huán),這樣while檢測stop條件就不會執(zhí)行,
       * 失去了意義。
       */
      while ((System.currentTimeMillis() - time < 1000)) {}
    }
    System.out.println("線程StopThread正在結(jié)束");
  }
  // 線程終止
  public void stopFlag() {
    stop = true;
  }
}

二、java線程中斷機制

下面看看Thread類里的三個方法:

1. public static boolean interrupted():檢測當(dāng)前線程是否已經(jīng)中斷。線程的中斷狀態(tài)由該方法清除。如果連續(xù)兩次調(diào)用該方法,則第二次調(diào)用將返回 false(在第一次調(diào)用已清除了其中斷狀態(tài)之后,且第二次調(diào)用檢驗完中斷狀態(tài)前,當(dāng)前線程再次中斷的情況除外)。

2. public boolean isInterrupted():測試線程是否已經(jīng)中斷。線程的中斷狀態(tài)不受該方法的影響。

3. public void interrupt(): 中斷線程。

interrupt()只是改變中斷狀態(tài)而已. 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
public class TestInterrupt1 {
  public static void main(String[] args) throws InterruptedException {
    Thread t = new MyThread();
    t.start();
    t.interrupt();
    System.out.println("調(diào)用線程的interrupt()方法");
    System.out.println("線程的中斷狀態(tài):" +t.isInterrupted());
  }
  static class MyThread extends Thread {
    public void run() {
      long time = System.currentTimeMillis();
      System.out.println("線程正在運行");
      /*
       * 使用while循環(huán)模擬 sleep 方法,這里不要使用sleep,否則在阻塞時會拋
       * InterruptedException異常而退出循環(huán)。
       */
      while ((System.currentTimeMillis() - time < 1000)) {}
      System.out.println("線程的中斷狀態(tài):" + Thread.interrupted());
      System.out.println("線程的中斷狀態(tài)被清除:" +isInterrupted());
      while ((System.currentTimeMillis() - time < 5000)) {}
      System.out.println("線程運行完成");
    }
  }
}

正常輸出:

?
1
2
3
4
5
6
調(diào)用線程的interrupt()方法
線程正在運行
線程的中斷狀態(tài):true
線程的中斷狀態(tài):true
線程的中斷狀態(tài)被清除:false
線程運行完成

實際上當(dāng)調(diào)用interrupt()方法的時候,只是設(shè)置了要中斷線程的中斷狀態(tài),而此時被中斷的線程的可以通過isInterrupted()或者是Thread.interrupted()方法判斷當(dāng)前線程的中斷狀態(tài)是否標(biāo)志為中斷。

調(diào)用線程的wait(), wait(long)或wait(long, int)會讓它進入等待(阻塞)狀態(tài),或者調(diào)用線程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也會讓它進入阻塞狀態(tài)。若線程在阻塞狀態(tài)時,調(diào)用了它的interrupt()方法,那么它的“中斷狀態(tài)”會被清除并且會收到一個InterruptedException異常。例如,線程通過wait()進入阻塞狀態(tài),此時通過interrupt()中斷該線程;調(diào)用interrupt()會立即將線程的中斷標(biāo)記設(shè)為“true”,但是由于線程處于阻塞狀態(tài),所以該“中斷標(biāo)記”會立即被清除為“false”,同時,會產(chǎn)生一個InterruptedException的異常。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class InterruptTest extends Thread{
  public static void main(String[] args) throws InterruptedException {
    InterruptTest t=new InterruptTest();
    t.start();
    Thread.sleep(1000);
    t.interrupt();
  }
  public void run(){
    while(!Thread.interrupted()){
      System.out.println("Thread is running.....");
      try {
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
}

正常運行結(jié)果:

java多線程中斷代碼詳解

系統(tǒng)復(fù)位。我們可以手動的使用Thread.interrupted()來使當(dāng)前線程的中斷狀態(tài)系統(tǒng)復(fù)位(即清除中斷狀態(tài)),其實是在sleep,wait,join這些方法內(nèi)部會不斷檢查中斷狀態(tài)的值,而自己拋出的InterruptedException。

中斷:如果線程在調(diào)用Object類的wait()、wait(long)或wait(long, int)方法,或者該類的 join() 、join(long) 、join(long, int) 、sleep(long) 或 sleep(long, int) 方法過程中受阻,則其中斷狀態(tài)將被清除,它還將收到一個 InterruptedException。

如果該線程在可中斷的通道(java.nio.channels.InterruptibleChannel)上的 I/O 操作中受阻,則該通道將被關(guān)閉,該線程的中斷狀態(tài)將被設(shè)置并且該線程將收到一個 ClosedByInterruptException。

如果該線程在一個 Selector (java.nio.channels.Selector) 中受阻,則該線程的中斷狀態(tài)將被設(shè)置,它將立即從選擇操作返回,并可能帶有一個非零值,就好像調(diào)用了選擇器的 wakeup 方法一樣。

如果以前的條件都沒有保存,則該線程的中斷狀態(tài)將被設(shè)置。

中斷一個不處于活動狀態(tài)的線程不需要任何作用。

檢測中斷:如何檢測中斷決定于線程所做的事情。

如果線程調(diào)用可以拋出InterruptException的方法,則捕獲InterruptException,然后在catch塊中處理(通常是退出run方法以中斷線程)

如果調(diào)用其它方法,則可以在空閑時檢查Thread.interrupted以判斷是否收到中斷信號,確認(rèn)收到中斷信號后進行處理??梢話伋鲆粋€InterruptException從而和前一種處理方法保持一致

中斷狀態(tài):線程的中斷機制是使用中斷狀態(tài)這一內(nèi)部標(biāo)志實現(xiàn)的。中斷狀態(tài)在調(diào)用線程的interrupt()方法時被設(shè)置(參考上面的interrupt方法說明)。

可以發(fā)現(xiàn),isInterrupted被聲明為native方法,取決于JVM底層的實現(xiàn)。調(diào)用線程的interrupt方法,并不能立即引發(fā)中斷,只是設(shè)置了JVM內(nèi)部的中斷標(biāo)記。因此,通過檢查中斷標(biāo)記,應(yīng)用程序可以做一些特殊操作,也可以完全忽略中斷。

實際上Thread.interrupt()方法實際上通過某種方式通知線程,并不會直接中止該線程。具體做什么事情由寫代碼的人決定,通常我們會中止該線程。

三、一些不會拋出 InterruptedException 的線程阻塞操作

對于某些線程阻塞操作,JVM并不會自動拋出InterruptedException異常。例如,某些I/O操作和內(nèi)部鎖操作。對于這類操作,可以用其他方式模擬中斷:

1)java.io中的異步socket I/O

讀寫socket的時候,InputStream和OutputStream的read和write方法會阻塞等待,但不會響應(yīng)java中斷。不過,調(diào)用Socket的close方法后,被阻塞線程會拋出SocketException異常。

2)利用Selector實現(xiàn)的異步I/O

如果線程被阻塞于Selector.select(在java.nio.channels中),調(diào)用wakeup方法會引起ClosedSelectorException異常。

3)鎖獲取

如果線程在等待獲取一個內(nèi)部鎖,我們將無法中斷它。但是,利用Lock類的lockInterruptibly方法,我們可以在等待鎖的同時,提供中斷能力。

總結(jié)

以上就是本文關(guān)于java多線程中斷代碼詳解的全部內(nèi)容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復(fù)大家的。感謝朋友們對本站的支持!

原文鏈接:https://www.2cto.com/kf/201609/546958.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 桃乃木香在线 | 亚洲福利天堂 | 91一区二区在线观看精品 | 国产精品久久久久久久人人看 | 91tm视频| 超级乱淫伦小说1女多男 | 99视频在线免费观看 | 国产高清一区二区三区免费视频 | 日本视频二区 | 欧美午夜网站 | 亚洲AV永久无码精品老司机蜜桃 | 加勒比久草| 免费高清www动漫视频播放器 | 性色欲情网站IWWW九文堂 | 四虎在线精品免费高清在线 | 91天堂素人97年清纯嫩模 | 爱情岛论坛自拍永久入口 | 日本高清视频网站www | 免费视频完整版在线观看网站 | 午夜伦伦电影理论片大片 | 国产在线视频第一页 | 亚洲国产精品综合久久网络 | 男人插女人软件 | 成年人免费在线视频 | 性做久久久久久久 | bl高h荡肉古代np | 香蕉eeww99国产精选播放 | 校园纯肉H教室第一次 | 国产午夜精品不卡视频 | 久久国产伦子伦精品 | 9热在线精品视频观看 | 韩国美女vip内部2020 | 久久中文骚妇内射 | 日韩精品一区二区三区中文版 | 九九在线精品亚洲国产 | 色婷在线 | 小草高清视频免费直播 | 好妈妈7在线观看高清 | 麻豆在线传煤 | 小兰被扒开内裤露出p | 91视频夜色 |