Java多線程(十二):中斷機制


這里詳細分析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("線程中斷了,程序到這里了");
    }
}

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM