java多线程(六)-线程的状态和常用的方法
一个线程可以处于以下几种状态之一:

(1) 新建(new):当线程被创建时,它只会短暂的处于这种状态,此时它已经获得了必须的系统资源,并执行了初始化,该线程已经有资格获取cpu时间了,之后它将转化为可运行状态或阻塞状态。
(2) 就绪(Runnable):万事俱备,只欠东风,该线程在等待着,只要调度器把时间片分配给线程,它就可以运行了。
(3) 阻塞(Blocked):线程虽然可以运行,但是缺乏某项资源,或者某个条件阻止它运行。(比如得不到打印机资源,调用了sleep,wait方法,无法得到某个锁),当线程处于Blocked状态时,调度器将忽略它,不给它分配任何时间片,除非线程重新进入了就绪状态,它才有可能执行操作。
(4) 运行(run):春风得意马蹄疾,得到了所有资源和cpu时间片的线程正在执行。(就是执行run()方面)。
(5) 死亡(Dead):兔死狗烹,鸟尽弓藏,线程已经执行完了它的任务,(当然,它也有可能是被中断(interrupt)的),此时的线程不能被调度了,也不可能得到cpu的时间片了。
在线程的一系列操作中,还有一些值得注意的行为或方法。
1, 休眠,Thread.sleep(long millis),该线程休眠millis毫秒,不过java5之后,可以使用TimeUnit.MILLISECONDS.sleep(timeout),更加清晰,这个类还有其他的时间单元。SECONDS/MINUTES等。
2, 优先级,在Thread.currentThread().setPriority(int priority)可以设置线程的优先级。虽然CPU处理线程集的顺序是不确定的,但是线程调度器将倾向于让优先级高的线程先执行。
其实对于航天器等使用的嵌入式操作系统。它们都是通过硬件中断方式去执行更高级别的任务的。
3, 让步,当调用Thread.yield()时,建议 具有相同优先级的其他线程可以运行了。但是既然是建议,所以实际上怎么执行,那不是程序员所能控制的,所以在重要的控制时,绝对不能指望 yield起作用,就像System.gc()一样,所起的作用都只是建议。
4, 后台(daemon)方法,在Thread对象启动之前,可以调用 setDaemon(boolean )来设置线程为后台线程,一般用来在程序运行时在后台提供一种通用服务。最大的特点是,如果所有的非后台线程结束时,那么程序就终止了,同时所有的后台进行也就被杀死了。
有些资料中,将daemon线程称为 守护线程。前台运行的线程称为 用户线程(User Thread).
在java的try finally块中,那怕在try中用了return语句,finally块的内容也会执行,所以重要的资源关闭等操作都是放在 finally块中的,但是对于后台线程并非如此, 当最后一个非后台线程都关闭后,jvm会突然关闭所有的后台线程,所以哪怕后台线程如果剩下finally块没执行,也一样会被关闭的。
线程组
当年sun搞了一个线程组的概念,持有一个线程的集合。但是其实这是一个不成功的尝试,所以可以忽略这个概念了。但是sun关于这个问题,也从来没有官方声明。也许用一句话可以解释。“继续错误的代价由别人来承担,但是承认错误的代价由自己承担”.(援引《Thinking in java》)
-------
作者: www.yaoxiaowen.com
github:https://github.com/yaowen369
java多线程(六)-线程的状态和常用的方法的更多相关文章
- Java多线程之线程的状态迁移
Java多线程之线程的状态迁移 下图整理了线程的状态迁移.图中的线程状态(Thread.Stat 中定义的Enum 名)NEW.RUNNABLE .TERMINATED.WAITING.TIMED_W ...
- Java多线程(六) —— 线程并发库之并发容器
参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...
- Java多线程之线程的状态以及线程间协作通信导致的线程状态转换
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html 一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...
- Java多线程(六) 线程系列总结
多线程系列终于终结得差不多,本人对该系列所做的总结大致如下: 线程锁模块耗费了大量的时间,底层的AQS实现比较复杂.仍然没有时间总结源码部分,能够坚持写下这么几个篇幅的内容真心佩服自己....希望继续 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- Java多线程父子线程关系 多线程中篇(六)
有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...
- Java多线程与线程池技术
一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...
- Java多线程之线程其他类
Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...
- Java多线程之线程协作
Java多线程之线程协作 一.前言 上一节提到,如果有一个线程正在运行synchronized 方法,那么其他线程就无法再运行这个方法了.这就是简单的互斥处理. 假如我们现在想执行更加精确的控制,而不 ...
随机推荐
- 2017最新PHP面试题
这几天在面试,下面分享一下这几天面试所遇到的笔试题,目前还不打算工作,面试题会持续更新的,有些不想写答案了,有心的可以自己看着面试题查一下感觉记忆更深点.下面分享一下这几天遇到的php面试题. 掌贝面 ...
- 封装及propery的使用
封装 封装的目的 使类中的属性或者方法只允许在类内部使用,不允许外部对其访问,保证数据的安全性. 封装的方法 使属性或者函数名改写成:"__属性名或者函数名"的格式,即完成了对本类 ...
- Python开发工具PyCharm个性化设置
Python开发工具PyCharm个性化设置,包括设置默认PyCharm解析器.设置缩进符为制表符.设置IDE皮肤主题等,大家参考使用吧 1.设置默认PyCharm解析器: 操作如下: Pyt ...
- Android学习笔记(10).布局管理器
布局管理器的几个类都是ViewGroup派生的,用于管理组件的分布和大小,使用布局管理器能够非常好地解决屏幕适配问题. 布局管理器本身也是一个UI组件,布局管理器能够相互嵌套使用,以下是布局管理器的类 ...
- 我的Java开发学习之旅------>Base64的编码思想以及Java实现
Base64是一种用64个字符来表示随意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,由于二进制文件包括非常多无法显示和打印的字符.所以,假设要让记事本这种 ...
- REST设计规则
1.简介 REST(Representational State Transfer), 表述性状态转移是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格. REST只是一 ...
- MVC+EF 入门教程(四)
一.前言 写了那么久,那么现在给大家看效果了 二.效果展示 点击创建Blog 显示 编辑 编辑成功,是不是很酷. 删除 终于完成了,准备睡觉!虽然有很多不足的地方,我会慢慢的去改的.感谢累了一天的自己 ...
- MySQL学习(二)复制
复制解决的问题是保持多个服务器之间的数据的一致性,就如同通过复制保持两个文件的一致性一样,只不过MySQL的复制要相对要复杂一些,其基本过程如下: 1)在主库上将数据更改记录到二进制日 ...
- mac下通过mdfind命令搜索文件
mdfind命令就是Spotlight功能的终端界面,这意味着如果Spotlight被禁用,mdfind命令也将无法工作.mdfind命令非常迅速.高效.最基本的使用方法是: mdfind -name ...
- git入门(msysgit安装)
1.下载git-for-windows 常用的GitHub客户端msysgit,也就是git-for-windows. 登录官网 https://git-for-windows.github.io/, ...