线程打印状态_Java线程状态的转换

根据上面关于线程状态的介绍我们可以得到下面的线程状态转换图:

9b7a04bee720483ea1e8a21e4b9bac1f.png

BLOCKED与RUNNABLE状态的转换

我们在上面说到:处于BLOCKED状态的线程是因为在等待锁的释放。假如这里有两个线程a和b, a线程提前获得了锁并且暂未释放锁,此时b就处于BLOCKED状态。我们先来看一个例子:

a67405da795c58c02100acfbbb609c54.png

初看之下,大家可能会觉得线程a会先调用同步方法,同步方法内又调用了Thread.sleep()方法,必然会输出TIMED. WAITING, 而线程b因为等待线程a释放锁所以必然会输出BLOCKED。

其实不然,有两点需要值得大家注意,-是在测试方法blockedTest()内还有一个main线程,二是启动线程后执行run方法还是需要消耗-定时间的。 不打断点的情况下,上面代码中都应该输出RUNNABLE。

测试方法的main线程只保证了a,b两个线程调用star()方法(转化为RUNNABLE状态), 还没等两个线程真正开始争夺锁,就已经打印此时两个线程的状态(RUNNABLE) 了。

这时你可能又会问了,要是我想要打印出BLOCKED状态我该怎么处理呢?其实就处理下测试方法里的main线程就可以了,你让它休息一会儿,打断点或者调用Thread .sleep方法就行。

这里需要注意的是main线程休息的时间,要保证在线程争夺锁的时间内,不要等到前一个线程锁都释放了你再去争夺锁,此时还是得不到BL OCKED状态的。我们把上面的测试方法blockedTest()改动一下:

7393c6e042155ed62aca11ef92967ed0.png

在这个例子中,由于main线程休眠,所以线程a的run()方 法跟着执行,线程b再接着执行。

在线程a执行run()调用testMethod()之后,线程a休眠了2000ms (注意这里是没有释放锁的),main线程休眠完毕,接着b线程执行的时候是争夺不到锁的,所以这里输出:

57c860aa40bb1aea8815eb9b2320baac.png

WAITING状态与RUNNABLE状态的转换

根据转换图我们知道有3个方法可以使线程从RUNNABL E状态转为WAITING状态。我们主要介绍”FObject.wait)和Threadjoin()。Object.wait()调用wait()方法前线程必须持有对象的锁。

线程调用wait)方法时,会释放当前的锁,直到有其他线程调用notlf)ntifyA()方法唤醒等待锁的线程。

需要注意的是,其他线程调用notify()方法只会唤醒单个等待锁的线程,如果有多个线程都在等待这个锁的话不一定会唤醒到之前调用wait()方法的线程。同样,调用notifyAI()方法唤醒所有等待锁的线程之后,也不一定会马上把时间片分给刚才放弃锁的那个线程,具体要看系统的调度。

Threadjoin()

调用join()方法不会释放锁,会一直等待当前线程执行完毕(转换为TERMINATED状态)。

我们再把上面的例子线程启动那里改变一下:

f03f08965117b0cadf0538d5ab773b4d.png

要是没有调用join方法,main线程不管a线程是否执行完毕都会继续往下走。

a线程启动之后马.上调用了join方法,这里main线程 就会等到a线程执行完毕,所以这里a线程打印的状态固定是TERMIATED。

至于b线程的状态,有可能打印RUNNABLE (尚未进入同步方法),也有可能打印TIMED_ WAITING (进入了同步方法)。

TIMED_ WAITING 与RUNNABLE状态转换

TIMED_ WAITING与WAITING状态类似,只是TIMED_ WAITING状态等 待的时间是指定的。

Thread.sleep(long)

使当前线程睡眠指定时间。需要注意这里的“睡眠”只是暂时使线程停止执行,并不会释放锁。时间到后,线程会重新进入RUNNABLE状态。

Object. wait(ong)

wait(long)方法使线程进入TIMED_ WAITING状态。这里的waitlong)方法与无参方法wait)相同的地方是,都可以通过其他线程调用notfy()或otlyAl()方法来唤醒。

不同的地方是,有参方法wait(long)就算其他线程不来唤醒它,经过指定时间long之后它会自动唤醒,拥有去争夺锁的资格。

Thread,join(long)

join(ong)使当前线程执行指定时间,并且使线程进入TIMED_ WAITING状态。

我们再来改一改刚才的示例:

d762323a9509b1ba687e0f85ba9bea14.png

这里调用a. join(1000L),因为是指定了具体a线程执行的时间的,并且执行时间是小于a线程sleep的时间,所以a线程状态输出TIMED. _WAITING。b线程状态仍然不固定(RUNNABL E或BL OCKED).

线程中断

在某些情况下,我们在线程启动后发现并不需要它继续执行下去时,需要中断线程。目前在Java里还没有安全直接的方法来停止线程,但是Java提供了线程中断机制来处理需要中断线程的情况。

线程中断机制是-种协作机制。需要注意,通过中断操作并不能直接终止一个线程,而是通知需要被中断的线程自行处理。

简单介绍下Thread类里提供的关于线程中断的几个方法:

Threadinterrupt(): 中断线程。这里的中断线程并不会立即停止线程,而是设置线程的中断状态为rue (默认是fase) ;

Thread interrupted(): 测试当前线程是否被中断。线程的中断状态受这个方法的影响,意思是调用一次使线程中断状态设置为true,连续调用两次会使得这个线程的中断状态重新转为false;

Thread,isinterrupted(): 测试当前线程是否被中断。与上面方法不同的是调用这个方法并不会影响线程的中断状态。

在线程中断机制里,当其他线程通知需要被中断的线程后,线程中断的状态被设置为true,但是具体被要求中断的线程要怎么处理,完全由被中断线程自己而定,可以在合适的实际处理中断请求,也可以完全不处理继续执行下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpStudy中Xdebug设置 phpStorm设置

在windows系统使用phpstduy集成环境,PHP版本为7.0.1,参考网上文章配置后,在phpinof()中没有xdebug信息, 解决方法,拷贝widzrd.php中提示的文件路径,重启phpstudy后,终于有了xdebug。 1.查看php信息&#x…

SQLSERVER EXCEPT运算符=ORACLE MINUS

Oracle中 MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存…

音乐 美术 劳技 计算机教研组工作总结,音体美信息教研组工作总结

音体美信息教研组工作总结本学期音体美信息技术教学工作围绕教研室,结合教导处教研工作安排和音体美劳信息学科特点,以新课程理念建设为核心,以提高教师新课程改革的实践与创新能力为重点,以集中教研培训、校本培训和课改实践课相…

python3.5安装scrapy_Python3.5 win7安装scrapy

1、搭建虚拟环境pip install virtualenvwrapper2、指定虚拟环境存放文件路径2.1:E盘新建EvEvns2.2:计算机->高级系统设置->环境变量->系统变量->新建变量名:WORKON_HOME变量值:E:\Evns保存并退出3、创建虚拟环境mkvirtualenv py34、进入虚拟…

flex 点击空格键会有以前点击过的事件的保留

点击了一个按钮那个就会有焦点。 flex的空格键是默认触发有焦点的按钮的点击事件的。 所以你要在那里按钮事件里面写一个this.setFocus()让焦点消失,就可以去除空格键点击的效果了。

GOAndroid的安装和配置

android环境的配置还是比较复杂的,特别对于我这样一直使用mfc的程序员来说,有很多观念上需要转变。好在配置成功后就能够不断复用,那么这样的问题值得整理出来 一、安装jdk 二、解压adt-bundle-windows(GO)。其中sdk是配置好的 三、配置环境变…

物理与计算机信息工程学院,泉州师范学院物理与信息工程学院

泉州师范学院坐落在全国首批历史文化名城、著名侨乡、国际花园城市——福建省泉州市,有东海和诗山两个校区,占地1185亩。东海主校区位于晋江和洛阳江两江交汇处,携江临海,极目古港沧澜;诗山校区南倚高盖名山&#xff0…

开发项目之考研计划_软件测试之项目测试计划模板

1. 引言1.1. 文档版本1.2. 项目情况1.3. 预期读者----部门经理----项目经理----测试经理----需求分析师----开发工程师----测试工程师----XXX银行经理----XXX基金公司经理1.4. 项目质量定义本项目软件测试是为了保障,XXX财务核算系统在应对营改增政策调整的系统升级…

ie9支持string.trim()

忽然间发现 ie9支持string.trim()! 搞得我以为我写的代码是对的,结过在别的浏览器上一测就报错了。

12.18栈、队列练习题

12.18栈、队列练习题 要求: 栈和队列是线性数据结构的代表,结构简单,易于理解。 1、Noi网站上的必须全做完。 2、codevs上栈和队列的所有等级题全部做 3、线性结构中有个知识点是哈希,1229、1553必须做,不明白哈希的同…

计算机软件总体上分为,山大2017春季班期末考试 信息系统B

管理信息系统模拟题一、填空1、管理信息系统及其子系统组成一个关系图,其关系图中的子系统的中英含义分别是( ),(),()()和( )。2、根据美国国家标准学会(ANSI)于1975年规定了数据库按三级体系结构组织的标准,这就是有名的SPARC分级结构。这三…

KeyCode对照表

字母和数字键的键码值(keyCode)按键键码按键键码按键键码按键键码 A65J74S83149B66K75T84250C67L76U85351D68M77V86452E69N78W87553F70O79X88654G71P80Y89755H72Q81Z90856I73R82048957数字键盘上的键的键码值(keyCode)功能键键码值(keyCode)按键键码按键键码按键键码按键键码 0…

随机效应估算与固定效应估算_一般混合线性模型固定效应、随机效应与另一随机向量的联合估计...

一般混合线性模型固定效应、随机效应与另一随机向量的联合估计周永正【期刊名称】《数学的实践与认识》【年(卷),期】2011(041)019【摘要】讨论一般混合线性模型中固定效应β、随机效应ξ(i1,2,…,k)与另一随机向量δ的联合估计,得到了β、ξi(i1,2,…,k)及δ的线性组合的最佳线…

小型移动 webApp Demo 知识点整理

包括内容: css初始化、css全局设置、常用meat标签、rem适配、flex布局、相关技巧(手势库使用、多行截字、1像素边线、点击状态、placeholder居中等) reset 引用 normalize.css css全局设置 包括字体、行高、默认webkit浏览器属性重置 meta标签(禁用长按…

2020计算机领域前沿热门技术,CFP: ICPCSEE 2020 (SCI or EI Indexd) 第6届国际计算机前沿大会...

ICPCSEE 2020第六届国际计算机前沿大会CALL FOR PAPER征稿通知(SCI or EI Indexed)September 18-21,2020Taiyuan, ChinaThe 6th International Conference of Pioneering Computer Scientists, Engineers and Educators(ICPCSEE)2020(http://2020.icpcsee.org) will be held in…

前端学习(2218):react元素渲染之函数式函数式编程

index.js import React from react; import ReactDOM from react-dom; import ./index.css; import App from ./App; import { tsPropertySignature } from babel/types;//<app/>js的普通对象 /*let app < App / >let root document.getElementById(root)let h1…

js 确定主窗体是否存在

if(typeof(window.opener)!object) {alert(主窗体存在)}

aix查看lv_Aix 添加VG,LV并挂载使用

一、 创建VG和删除VG//建VGsmit lvm 或 smit mkvg--Volume Groups--VOLUME GROUP name 【 卷名 】--Physical partition SIZE in megabytes 【1024】--* PHYSICAL VOLUME names 【 ESC4 选硬盘 】//删VG如果上面有lv 需要先关闭vgvaryoffvg emcvgsmit vg--Remove a Volume Grou…