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

(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. Hibernate学习(五)Hibernate 多对多映射

    说到多对多关系,印象最深刻的就是大学的选修课.一个学生可以选修多门课程,一门课程可以有多个学生选修,学生所选的每一门课程还有成绩.这个场景的E-R图如下: 对于多对多的关系,我们通常会抽出一张中间表( ...

  2. linux进程管理和系统状态查看命令简介

    1 进程管理简介 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 2 常用命令 2.1 pstree 2.1.1 功能描 ...

  3. OI大佬博客集

    郭家宝:byvoid  早年大牛,题解更新到2014年,其博客内容非常丰富,不止题解 hzwer:hzwer 从OI到ACM,一直在更新 陈立杰:WJMZBMR 无需解释,不过貌似只更到2015 顾森 ...

  4. tyvj4877 组合数

    1.组合数 (zero.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合:从m个不 ...

  5. java爬虫HttpURLConnect获取网页源码

    public abstract class HttpsURLConnection extends HttpURLConnection HttpsURLConnection 扩展 HttpURLConn ...

  6. CUDA编程(六)进一步并行

    CUDA编程(六) 进一步并行 在之前我们使用Thread完毕了简单的并行加速,尽管我们的程序运行速度有了50甚至上百倍的提升,可是依据内存带宽来评估的话我们的程序还远远不够.在上一篇博客中给大家介绍 ...

  7. Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

    1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputin ...

  8. C#调用RESTful API

    如今非常多的网络服务都用RESTful API来实现. 比方百度的搜索推广API介绍使用Rest原因:REST+JSON风格的API相比SOAP+XML,优点是:调用更加灵活.也更easy扩展:JSO ...

  9. 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接

    前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...

  10. node.js之路由,中间件,ge请求和post请求的参数

    一.路由 1.什么是路由 服务器需要根据不同的URL或请求来执行不一样的操作,我们可以通过路由来实现这个步骤 2.实现路由的方法 2.1.get请求访问网址时,做什么事 1 app.get(" ...