欢迎大家来到IT世界,在知识的湖畔探索吧!
前言:线程属性包括:线程优先级、守护线程、线程组以及处理未捕获异常的处理器。
1、线程优先级:Java中每个线程有一个优先级。默认情况下,一个线程继承它的父线程的优先级。
(1)setPriority方法:可以使用setPriority方法提高或降低线程的优先级。优先级设置范围为MIN_PRIORITY(在Thread类中定义为1)与MAX_PRIORITY(定义为10)之间的任何值。NORM_PRIORITY定义为5。
(2)线程调度器总会首先选择优先级较高的线程。但线程优先级是高度依赖于系统的。当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机平台的优先级上,优先级个数也许更多,也许更少。
(3)不要将程序构建为功能的正确性依赖于优先级。如果有几个高优先级的线程没有进入非活动状态,低优先级的线程可能永远也不能执行。调度器总会首先选择高优先级线程,尽管会使低优先级线程完全饿死。
(4)Thread类的几个属性:
(4.1)void setPriority(int newPriority)方法:设置线程的优先级。优先级取值范围在Thread.MIN_PRIORITY和Thread.MAX_PRIORITY之间。一般使用Thread.NORM_PRIORITY。
(4.2)static int MIN_PRIORITY:线程的最小优先级。值为1。
(4.3)static int NORM_PRIORITY:线程的默认优先级。值为5。
(4.4)static int MAX_PRIORITY:线程的最高优先级。值为10。
(4.5)static void yield():导致当前执行线程处于让步状态。如果有其他可运行线程具有至少与此线程同样高的优先级,这些线程将会被调度。
2、守护线程(daemon thread):可以通过setDaemon(true)将线程转换为守护线程。守护线程的唯一用途是为其他线程提供服务。
(1)例子:计时线程,定时发送“计时器滴答”信号给其他线程或清空过时的高速缓存项的线程。
(2)当只剩下守护线程时,就没必要继续运行程序了。此时虚拟机将退出。
(3)守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候,甚至在一个操作的中间发生中断。
3、未捕获异常处理器:
(1)线程的run方法不能抛出任何受查异常,非受查异常会导致线程终止、死亡。但无需任何catch子句来处理可以被传播的异常。
(2)setUncaughtExceptionHandler()方法:为单个线程安装一个异常处理器。
(3)setDefaultUncaughtExceptionHandler()方法:为所有线程安装一个默认的处理器。
(4)替换异常处理器可以使用日志API发送未捕获异常的报告到日志文件。
4、ThreadGroup对象:
4.1、如果不安装默认的异常处理器,默认的处理器为空。但如果不为独立的线程安装异常处理器,此时的处理器就是该线程的ThreadGroup对象。
4.2、ThreadGroup类实现了Thread.UncaughtExceptionHandler接口,它的uncaughtException方法进行如下操作:
(1)如果该线程组有父线程组,那么父线程组的uncaughtException方法被调用。
(2)否则,如果Thread.getDefaultUncaughtExceptionHandler()方法返回一个非空的处理器,则调用该处理器。
(3)否则,如果Throwable是ThreadDeath的一个实例,什么都不做。
(4)否则,线程的名字以及Throwable的栈轨迹被输出到System.err上。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/22569.html