> 文章列表 > Java核心技术知识点笔记—线程(属性)

Java核心技术知识点笔记—线程(属性)

Java核心技术知识点笔记—线程(属性)

前言:线程属性包括:线程优先级、守护线程、线程组以及处理未捕获异常的处理器

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上。

胶水百科网