zoukankan      html  css  js  c++  java
  • 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("线程中断了,程序到这里了");
        }
    }
    

    检查线程是否中断,中断线程,运行结果如下

    ······
    线程没有被中断
    线程没有被中断
    线程没有被中断
    线程被中断了
    线程中断了,程序到这里了
    
  • 相关阅读:
    CEF调试符号下载地址
    Koa搭建静态文件服务器
    查看requireJS已经加载的模块
    Android Unterminated string at character
    【微信支付】公众号 JSAPI支付 HTML5(使用MUI前端框架)+WebApi 实现流程
    winform 替换word文档中的字段(包含图片添加),生成导出PDF文件(也可是word文件)
    小程序 获取用户信息及手机号码
    winform PictureBox图片上动态添加Label或其他控件
    Html5+Mui前端框架,开发记录(四):下拉菜单绑定数据、搜索、时间控件
    Html5+Mui前端框架,开发记录(三):七牛云 上传图片
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/11470748.html
Copyright © 2011-2022 走看看