JavaSE_03_Thread类02
1.1 线程状态概述
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中, 有几种状态呢?在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态:
| 线程状态 | 导致状态发生条件 |
| NEW(新建) | 线程刚被创建,但是并未启动。还没调用start方法。 |
| Runnable(可 运行) | 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操 作系统处理器。 |
| Blocked(锁阻 塞) | 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状 态;当该线程持有锁时,该线程将变成Runnable状态。 |
| Waiting(无限 等待) | 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个 状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。 |
| Timed Waiting(计时 等待) | 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态 将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、 Object.wait。 |
| Teminated(被 终止) | 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。 |
1.2 Timed Waiting(计时等待)
Timed Waiting在API中的描述为:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。
Thread.sleep(1000)//等待1秒后自己唤醒自己

1.3 BLOCKED(锁阻塞)
Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。
比如,线程A与线程B代码中使用同一锁,如果线程A获 取到锁,线程A进入到Runnable状态,那么线程B就进入到Blocked锁阻塞状态。等待线程A执行完成后线程B转换为Runnable状态

1.4 Waiting(无限等待)
Wating状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。必须由另一个线程通过 obj.notify(), obj.notifyAll() 唤醒
在同一个锁中通过 obj.wait()方法使线程进入无限等待状态
在同一个锁中通过 obj.wait()方法使线程进入无限等待状态转为锁阻塞状态,等待获得锁对象转化为可运行状态。

1.5 6种状态的转换

1.6带参数的等待唤醒
obj.wait();使当前相称进入无线等待状态,需要通过obj.notify()唤醒,进入锁阻塞状态。
obj.wait(2000);使当前相称进入无线等待状态,2秒后自动进入锁阻塞状态。
1.7线程之间的通信(在同一个锁中,但在不同的线程中)
/*
* 等待线程唤醒:线程之间的通信
* 调用wait方法,放弃cpu的执行 进入到waiting状态(无限等待)
* 调用notify方法
*
* 必须在同一同步代码块中,保证等待和唤醒只能有一个执行
*/
public class Demo10_等待唤醒_线程之间的通信 {
public static void main(String[] args) {
// 创建锁对象保证唯一
Object obj = new Object();
// 创建一个消费者线程
new Thread() {
@Override
public void run() {
while (true) {
// 保证等待和唤醒的线程只能有一个 需要使用同步技术
synchronized (obj) {
System.out.println("我需要一瓶水");
try {
obj.wait();
// obj.notify();唤醒线程之后执行 obj.wait();后的代码
System.out.println("消费者拿到了商品");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}.start(); // 创建一个生产者
new Thread() {
@Override
public void run() {
while (true) {
try {
// 花了1秒准备商品
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} synchronized (obj) {
System.out.println("生产商品需要1秒");
// 唤醒消费者告知 商品已经完成
obj.notify();
}
}
}
}.start();
}
}
JavaSE_03_Thread类02的更多相关文章
- Date 类 02
Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...
- 10JAVA基础-常用类02
Arrays 工具类,构造方法私有 //将数组转变为字符串 String str = Arrays.toString(int[] value); //对于原数组进行排序,升序 Arrays.sort( ...
- Android中经常使用的工具类02
1.读取手机联系人信息 一般用在读取手机通讯录上传,这一块比較多. import java.util.ArrayList; import java.util.List; import android. ...
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- JSP数据交互(二)和Servlet基础
01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...
- UIcollectionView的使用(首页的搭建1)
今天做一个首页的效果: 首页是用UICollectionView做的.下面我来结合首页的效果介绍一下: 一.创建基类继承自UIViewController 01 创建基类继承自UIViewContr ...
- Spring框架简单介绍
原文地址: http://my.oschina.net/myriads/blog/37922 1.使用框架的意义与Spring的主要内容 随着软件结构的日益庞大,软件模块化趋势出现,软件开发也须要多 ...
- 职责链模式(Chain of Responsibility)的Java实现
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 ...
随机推荐
- SpringBoot--Thymeleaf入门使用
一.概述 今天学习到了SpringBoot中的WEB开发,SpringBoot提供了spring-boot-stater-web为web开发给予支持,它里面内嵌了以下依赖: <dependenc ...
- 4_9.springboot2.x之使用外置servlet容器原理解析
问题概述 嵌入式Servlet容器: 应用打成可执行的jar 优点:简单.便携: **缺点:**默认不支持JSP.优化定制比较复杂(使用定制器[ServerProperties.自定义WebServe ...
- 面试系列九 es 提高查询效率
,es性能优化是没有什么银弹的,啥意思呢?就是不要期待着随手调一个参数,就可以万能的应对所有的性能慢的场景.也许有的场景是你换个参数,或者调整一下语法,就可以搞定,但是绝对不是所有场景都可以这样. 一 ...
- 在使用python语言的open函数时,提示错误OSError: [Errno 22] Invalid argument: ‘文件路径’
如题,在使用python语言的open函数时,提示错误OSError: [Errno 22] Invalid argument: '文件路径',在查阅了大量资料后也得到了一些解决方案,但是这些解决方案 ...
- UMP系统功能 资源管理
- HTML5 上传图片预览
html5出现之前如果需要上传图片预览 一般都是先上传到服务器然后远程预览 html5出现之后 有个filereader 解决了这问题 //选中图片之后 $("#fileAddPic&q ...
- 监听事件动态改变dom状态
html代码: <table class="table table-striped"> <thead> <tr> <th>分类ID& ...
- [JZOJ4648] 【NOIP2016提高A组模拟7.17】锦标赛
题目 描述 题目大意 有nnn个人,你要确定一个出场序列.每次新上台的人就会和擂主打一架,胜利的人继续当擂主.题目给出两两之间打架胜利(失败)的概率. 问111选手坚持到最后的最大概率. 思考历程 看 ...
- Python-数据分析模块
目录 numpy 模块 matplotlib 模块 pandas 模块 numpy 模块 numpy 模块主要用来做数据分析,对numpy数组 进行科学运算 主要方法和常用属性,都是用numpy 生成 ...
- php数据结构课程---6、常见排序有哪些
php数据结构课程---6.常见排序有哪些 一.总结 一句话总结: 冒泡排序(Bubble sort):依次交换 选择排序 ( Selection Sort ):在未排序序列中找到最小(大)元素,依次 ...