溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么實(shí)現(xiàn)java線程終止

發(fā)布時間:2021-11-16 15:24:38 來源:億速云 閱讀:126 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“怎么實(shí)現(xiàn)java線程終止”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么實(shí)現(xiàn)java線程終止”吧!

線程終止

不正確的線程終止 - stop stop: 終止線程, 并且清楚監(jiān)視器鎖的信息, 但是可能導(dǎo)致線程安全問題, JDK不建議使用

正確的線程終止 - interrupt 如果目標(biāo)線程在調(diào)用Object class的wait方法, join方法或sleep方法時被阻塞, 那么interrupt會生效, 該線程的中斷狀態(tài)將被清除,拋出InterruptedException 如果目標(biāo)線程是被I/O或者NIO的Channel所阻塞,, 同樣I/O操作會被中斷或者返回特殊異常, 達(dá)到終止線程的目的 如果以上條件都不滿足, 則會設(shè)置此線程的狀態(tài)為中斷狀態(tài)

代碼示例:

public class StopThread extends Thread {
  private int i = 0, j = 0;

  @Override
  public void run() {
    synchronized (this) {
      // 增加同步鎖,確保線程安全
      ++i;
      try {
        // 休眠10秒,模擬耗時操作
        Thread.sleep(10000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      ++j;
    }
  }

  /** * 打印i和j */
  public void print() {
    System.out.println("i=" + i + " j=" + j);
  }
}

線程stop/interrupt終止代碼示例:

public class Demo3 {
  public static void main(String[] args) throws InterruptedException {
    StopThread thread = new StopThread();
    thread.start();
    // 休眠1秒,確保i變量自增成功
    Thread.sleep(1000);
    // 暫停線程
    thread.stop(); // 錯誤的終止 運(yùn)行結(jié)果: i=1 j=0
    // thread.interrupt(); // 正確終止 運(yùn)行結(jié)果: 拋出java.lang.InterruptedException i=1 j=1
    while (thread.isAlive()) {
      // 確保線程已經(jīng)終止
    } // 輸出結(jié)果
    thread.print();
  }
}

正確的線程終止 - 標(biāo)志位

代碼邏輯中, 增加一個判斷, 用來控制線程的終止

代碼示例:

public class Demo4 extends Thread {
  public static volatile boolean flag = true;

  public static void main(String[] args) throws InterruptedException {
    new Thread(
            () -> {
              try {
                while (flag) { // 判斷是否運(yùn)行
                  System.out.println("運(yùn)行中");
                  Thread.sleep(1000L);
                }
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            })
        .start();
    // 3秒之后,將狀態(tài)標(biāo)志改為False,代表不繼續(xù)運(yùn)行
    Thread.sleep(3000L);
    flag = false;
    System.out.println("程序運(yùn)行結(jié)束");
  }
}

到此,相信大家對“怎么實(shí)現(xiàn)java線程終止”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI