91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java多線程 中斷機制及實例詳解

發布時間:2020-10-12 07:35:47 來源:腳本之家 閱讀:271 作者:慢慢來 欄目:編程語言

正文

這里詳細分析interrupt(),interrupted(),isInterrupted()三個方法

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();
  }

我們來找下如何設置中斷標識位的

找到interrupt0()的源碼,src/hotspot/share/prims/jvm.cpp

JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
 ...
 if (is_alive) {
  // jthread refers to a live JavaThread.
  Thread::interrupt(receiver);
 }
JVM_END

調用了Thread::interrupt方法

src/hotspot/share/runtime/thread.cpp

void Thread::interrupt(Thread* thread) {
 ...
 os::interrupt(thread);
}

os::interrupt方法,src/hotspot/os/posix/os_posix.cpp

void os::interrupt(Thread* thread) {
 ...
 OSThread* osthread = thread->osthread();
 if (!osthread->interrupted()) {
  //設置中斷標識位
  osthread->set_interrupted(true);
  ...
 }
  ...
}

isInterrupted()

測試線程是否被中斷,線程的中斷狀態不會改變

public boolean isInterrupted() {
    return isInterrupted(false);
  }

查看native isInterrupted(boolean ClearInterrupted)源碼,查找方式同上

src/hotspot/os/posix/os_posix.cpp

bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
 debug_only(Thread::check_for_dangling_thread_pointer(thread);)
 OSThread* osthread = thread->osthread();
 // 查看是否被中斷
 bool interrupted = osthread->interrupted();
 // 清除標識位后再設置false
 if (interrupted && clear_interrupted) {
  osthread->set_interrupted(false);
 }
 return interrupted;
}

Java傳遞ClearInterrupted為false,對應C++的clear_interrupted

interrupted()

測試線程是否被中斷,清除中斷標識位

  public static boolean interrupted() {
    return currentThread().isInterrupted(true);
  }

簡單的例子

public class MyThread45 {
  public static void main(String[] args) throws Exception
  {
    Runnable runnable = new Runnable()
    {
      public void run()
      {
        while (true)
        {
          if (Thread.currentThread().isInterrupted())
          {
            System.out.println("線程被中斷了");
            return ;
          }
          else
          {
            System.out.println("線程沒有被中斷");
          }
        }
      }
    };
    Thread t = new Thread(runnable);
    t.start();
    Thread.sleep(500);
    t.interrupt();
    System.out.println("線程中斷了,程序到這里了");
  }
}

檢查線程是否中斷,中斷線程,運行結果如下

······
線程沒有被中斷
線程沒有被中斷
線程沒有被中斷
線程被中斷了
線程中斷了,程序到這里了

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

罗江县| 分宜县| 禄劝| 鲜城| 达日县| 丹阳市| 桐乡市| 临邑县| 新蔡县| 靖安县| 泰兴市| 河曲县| 霍城县| 黔江区| 石首市| 孟连| 鄢陵县| 岳西县| 贺兰县| 东安县| 苗栗县| 龙山县| 新河县| 清新县| 喜德县| 通道| 民勤县| 黄浦区| 荆门市| 武定县| 韩城市| 阳曲县| 门头沟区| 廊坊市| 西青区| 五河县| 汾西县| 湾仔区| 中江县| 庆元县| 锦屏县|