一个线程可以处于以下几种状态之一:

(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多线程(六)-线程的状态和常用的方法的更多相关文章

  1. Java多线程之线程的状态迁移

    Java多线程之线程的状态迁移 下图整理了线程的状态迁移.图中的线程状态(Thread.Stat 中定义的Enum 名)NEW.RUNNABLE .TERMINATED.WAITING.TIMED_W ...

  2. Java多线程(六) —— 线程并发库之并发容器

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...

  3. Java多线程之线程的状态以及线程间协作通信导致的线程状态转换

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html  一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...

  4. Java多线程(六) 线程系列总结

    多线程系列终于终结得差不多,本人对该系列所做的总结大致如下: 线程锁模块耗费了大量的时间,底层的AQS实现比较复杂.仍然没有时间总结源码部分,能够坚持写下这么几个篇幅的内容真心佩服自己....希望继续 ...

  5. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  6. Java多线程父子线程关系 多线程中篇(六)

    有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...

  7. Java多线程与线程池技术

    一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...

  8. Java多线程之线程其他类

    Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...

  9. Java多线程之线程协作

    Java多线程之线程协作 一.前言 上一节提到,如果有一个线程正在运行synchronized 方法,那么其他线程就无法再运行这个方法了.这就是简单的互斥处理. 假如我们现在想执行更加精确的控制,而不 ...

随机推荐

  1. linux安装redis(转)

    一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...

  2. jQuery的$.ajax方法响应数据类型有哪几种?本质上原生ajax响应数据格式有哪几种,分别对应哪个属性?

    jQuery的$.ajax方法响应数据类型有:xml.html.script.json.jsonp.text 本质上原生ajax响应数据格式只有2种:xml和text,分别对应xhr.response ...

  3. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十六节--SignalR与ABP框架Abp.Web.SignalR及扩展

    SignalR简介 SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...

  4. html和css的区别

    html(结构) Hyper Text Markup Language(超文本标记语言)用于定义文档内容结构 1.该语言写的代码通常会被浏览器解析执行 2.超文本:不止包括文本,还有图片.链接.音乐. ...

  5. Java---String总结

    JAVA中的String类,不管是日常开发,或者是面试,都是常用的类之一,所以写在这里也为为了总结,方便以后的查阅与复习.   特点: 1.Java中所有的类中,String是使用最多的一个类 2.是 ...

  6. 2017最新安装mysql教程及遇到的问题解决Windows下

    今天因为换了个LINUX系统 把我的E盘不小心给卸载了 结果还是不能用  导致 我E盘里面的mysql也都被删除了    所以又要在次重新装一个MYSQL 了    花了很多时间  也看了很多教程.好 ...

  7. ML—高斯判别分析

    华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/12/11 高斯判别分析属于生成模型,模型终于学习一个特征-类别的联合概率. 0 多维正态分布 确定一个多维正态分布仅仅须要知道分布的均值 ...

  8. 两个linux之间拷贝文件及文件夹

    Linux为我们提供了两个用于文件copy的命令.一个是cp,一个是scp,可是他们略有不同,cp 主要是用于在同一台电脑上,在不同的文件夹之间来回copy文件 scp 主要是在不同的Linux系统之 ...

  9. hdu1181 变形课(vector容器+dfs)

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submi ...

  10. hdu 4109 dfs+剪枝优化

    求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...