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 方法,那么其他线程就无法再运行这个方法了.这就是简单的互斥处理. 假如我们现在想执行更加精确的控制,而不 ...
随机推荐
- php提供的对称加密算法
KEY 是之前定义的常量 Mcrypt::encrypt(); Mcrypt::decrypt(); defined('ROOT') or exit('Access Denied'); class M ...
- PHP魔术方法和魔术变量总结
从php5以后的版本,类就可以使用魔术方法了.PHP规定以两个下划线开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开 头,除非是为了重载已有的魔术方法. 目前php已有的魔术方法有 __c ...
- hibernate log4j
log4j.rootLogger=warn, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender. ...
- UWP 共享文件——发送者
这一节,顾名思义,即使你要共享数据给别人,你是数据的提供者.分两步即可1.直接复制代码 protected override void OnNavigatedTo(NavigationEventArg ...
- Wes7 剪裁方法
1. 加载x64的 DS共享库,加载一个compatibility.xml模板 2. 导入硬件信息文件File—Import—Import PMQ 用TAP.exe工具创建.PMQ文件(.PMQ文件保 ...
- let 和 const
let命令 1.let命令只在所在的代码快内有效 { let a = 'hello world' console.log(a) //hello world } console.log(a) //Unc ...
- C# httpclient获取cookies实现模拟web登录
目前在公司做一款平台化的产品,我主要负责PC端上的开发,在产品推荐过程中为了节省开发时间很多功能模块没来得及做原生,用CEF嵌入了很多带功能web页面,与客户端进行交互从而实现功能. 在二期开发中,产 ...
- 运行期以索引获取tuple元素-C++14
在编译期很容易根据索引来获取对应位置的元素,因为 tuple 的帮助函数 std::get<N>(tp) 就能获取 tuple 中第 N 个元素.然而我们却不能直接在运行期通过变量来获取 ...
- Android开发之监听发出的短信
执行效果图: 预备知识: 为了监听指定的ContentProvider的数据的改变,须要通过ContentResolver向指定Uri注冊CotentObserver监听器.ContentResolv ...
- hdu 4109 dfs+剪枝优化
求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...