Java线程生命周期的终止与复位怎么实现


这篇文章主要介绍“Java线程生命周期的终止与复位怎么实现”,在日常操作中,相信很多人在Java线程生命周期的终止与复位怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java线程生命周期的终止与复位怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!Java的线程状态描述放在Thread类里面的枚举类State中.总共包含了6中状态(从出生到死亡)。Java启动一个线程调用start方法,start方法内部调用了start0()native方法。这个测试是为了验证上图的正确性,只贴了部分.查看指引:jvm.cpp找到JVM_StartThread方法。发现是先创建个JavaThread作为本地线程然后启动这个本地线程(借助os【thread.cpp】,因为jvm是跨平台的,这里是以linux-os为示例)JavaThread 创建线程:thread.cpp 启动线程:线程的终止不要简单的调用stop方法,这个方法和其他的线程控制方法(suspend,resume)一样都是过期了不建议使用的,这些方法都是不安全的。 例如stop()方法在结束一个线程的时候并不保证线程资源的正常释放,因此可能导致出现一些不确定的状态。 按照人类逻辑来理解:T1线程调用方法修改T2线程的状态,但是T2现在在做什么T1是不清楚的,所以强制他关闭就是不安全的,就好比在Linux中使用kill -9杀掉一个进程。interrupt()方法只是修改了被中断线程的中断标志 ,并没有做什么过分的事儿。就像平时写代码的时候修改某对象的标志,对象自己通过标志类决定执行什么逻辑。这里也是一样,interrupt()方法修改中断标志,被中断的线程,自己决定做什么事儿(中断或者不中断都是被中断线程自己决定的,外部只是通知他,不是强迫他)。追一下源码。1.Java调用interrupt方法2.通过指引找到jvm.cpp#JVM_Interrupt方法这里还是以os_linux.cpp为例最终调用osthread的set_interrupted修改状态这里就印证了上方的Thread.interrupt()只是修改了线程的一个标志位 ,并没有做什么过分的事儿。interruptedisInterrupted这两个放在一起是因为他们底层都是调用的同一个native方法isInterrupted()只是给了不同的入参。 再就是,有过面试官问到他两的区别,所以干脆放在一起。首先说结论 ,isInterrupted()会返回线程的中断状态,interrupted()不仅会返回中断状态,而且如果线程处于状态状态还会将线程终端状态复位(清除中断状态)。os_linux.cpp的is_interrupted()方法印证了上面说的isInterrupted()会返回线程的中断状态,interrupted()不仅会返回中断状态,而且如果线程处于状态状态还会将线程终端状态复位(清除中断状态)。在Java中只要抛出了InnterruptException异常的方法都对线程进行了复位。先理顺下为什么要这么做:查看下基本上抛出InnterruptException异常的方法都是线程阻塞方法,比如sleep(),wait(),join()。这类方法执行后线程会处于TIMED_WAITING或者WAITING状态,处于这类状态的线程是不受控的(线程丧失了对自己的主导,需要其他的线程唤醒,或者阻塞时间到达才能拥有自己的主导权),这个时候线程中断,线程自己却没办法处理。甚至可能永远等不到释放而无法执行中断。所以,在线程是中断状态下,执行方法让线程阻塞,就要抛出一个异常告诉外界 ,我现在是阻塞状态,并且免费云主机域名将中断标记复位,方便外界进行处理(例如中断线程的执行或者继续阻塞方法),相当于给了外界一个改变线程状态的入口。 以sleep()为例追踪下源码:通过指引找到jcm.cpp#JVM_Sleep方法入口就直接判断线程的中断状态了 ,is_interrupted()上面介绍过了,参数为true就是清除中断标志并且返回清除之前的中断状态。这里线程是中断状态的就直接抛出InnterruptException sleep interrupted异常了。到此,关于“Java线程生命周期的终止与复位怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: Angular独立组件怎么使用

这篇文章主要介绍“Angular独立组件怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Angular独立组件怎么使用”文章能帮助大家解决问题。在Angular 14中, 开发者可以尝试使用独立组件开发各种组件,…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/02 19:20
下一篇 04/02 19:20

相关推荐