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

posted @ 2017-03-19 18:10 eleven_yw 阅读(...) 评论(...) 编辑 收藏