线程打印状态_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,一经查实,立即删除!

相关文章

GOAndroid的安装和配置

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

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

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

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…

前端学习(2217):react元素渲染之时钟

index.js import React from react; import ReactDOM from react-dom; import ./index.css; import App from ./App;//<app/>js的普通对象 /*let app < App / >let root document.getElementById(root)let h1<h1>helloworld<span>我是</span>…

winmail计算机三级,2016年计算机三级网络技术机考模拟题(1)

1、Winmail用户使用0utlook发送邮件时&#xff0c;使用协议是(  )。A&#xff0e;HTTPB&#xff0e;IMAPC&#xff0e;POP3D&#xff0e;SMTP2、子网掩码为255&#xff0e;128&#xff0e;0&#xff0e;0&#xff0c;该掩码又可以写为(  )。A&#xff0e;&#xff0f;8B&am…

前端学习(2216):react元素渲染

index.js import React from react; import ReactDOM from react-dom; import ./index.css; import App from ./App;//<app/>js的普通对象 let app < App / >let root document.getElementById(root)let h1<h1>helloworld<span>我是</span>&l…

计算机应用基础专科作业二,电子科大18秋《计算机应用基础(专科)》在线作业2...

电子科大18秋《计算机应用基础(专科)》在线作业2谋学网http://doc.docsou.com【奥鹏】[电子科技大学]18秋《计算机应用基础(专科)》在线作业2试卷总分:100 得分:100第1题,在浏览网页中&#xff0c;下列可能泄露隐私的是()。A、HTML文件B、文本文件C、CookieD、应用程序第2题,IP…

【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案

三、JavaScript部分 1、谈谈你对Ajax的理解&#xff1f;(概念、特点、作用) AJAX全称为“Asynchronous JavaScript And XML”&#xff08;异步JavaScript和XML&#xff09; 是指一种创建交互式网页应用的开发技术、改善用户体验&#xff0c;实现无刷新效果。 优点a、不需要插件…

前端学习(2219):react之jsx小案例

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<h1>…

前端学习(2220):react之jsx的样式小案例

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

SyntaxError: Non-UTF-8 code starting with '\xba' in file 错误的解决方法!!

第一次在Eclipse建立python工程&#xff0c;添加了自己新建的文件&#xff0c;写了一点代码&#xff0c;随后执行时候出现了错误&#xff0c;和昨天我在Visual Studio 2015里面一样&#xff0c;错误&#xff1a; SyntaxError: Non-UTF-8 code starting with \xba in file G:\wo…

三维向量变化为角度_物体的三维识别与6D位姿估计:PPF系列论文介绍(四)

作者&#xff1a;仲夏夜之星Date&#xff1a;2020-04-14来源&#xff1a;物体的三维识别与6D位姿估计&#xff1a;PPF系列论文介绍(四)文章“3D Pose Estimation of Daily ObjectsUsing an RGB-D Camera”2012发表在IEEE/RSJInternational Conference on Intelligent Robots an…

前端学习(2224):react之函数式组件

import React from react; import ReactDOM from react-dom;function Childcom() {let title < h2 > 我是副标题 < /h2>let weather "下雨"let isGo weather 下雨 ? "不出门" : "出门"return ( <div ><h1 > 函数式…

hive sqoop导出 postgresql精度丢失_Mysql 与 hadoop 数据同步(迁移),你需要知道 Sqoop...

上篇文章 Mysql 到 Hbase 数据如何实时同步&#xff0c;强大的 Streamsets 告诉你 我们说到了如何使用 Streamsets 来进行 mysql 到 hbase 的数据实时同步(迁移)。使用 Streamsets 的优点是部署简单&#xff0c;配置灵活&#xff0c;无需编写代码。认真阅读上篇文章的朋友会发现…

Less配置环境

一、安装Sublime 插件 1.安装Less插件&#xff1a; ctrlshiftp>install Package>输入less按Enter 2.安装Less2CSS插件&#xff1a;ctrlshiftp>install Package>输入less2css按Enter 作用&#xff1a;当保存less文件的时候自动生成同名的css文件&#xff1b;当保存…

前端学习(2225):react之类定义组件

import React from react; import ReactDOM from react-dom;function Childcom() {let title < h2 > 我是副标题 < /h2>let weather "下雨"let isGo weather 下雨 ? "不出门" : "出门"return ( <div ><h1 > 函数式…