Java多线程(五)——线程属性

在下面,我们讨论线程的一些属性:线程优先级,后台线程,线程组以及未处理异常的处理。

线程优先级

在Java编程语言中,每个线程都有一个优先级(priority)。默认情况下,线程的优先级是创建它的线程的优先级,你可以使用setPriority()方法设定线程的优先级。你可以将值设定为MIN_PRIORITY(默认情况下是1)到MAX_PRIORITY(默认是10)。NORM_PRIORITY被定义为5.
当线程调度器有机会调用新线程时,他倾向于运行优先级高的线程。但是,线程优先级很大程度上依赖于操作系统。当Java虚拟机将线程映射到平台的优先级时,线程优先级可能只有更少的优先级。
例如,Windows操作系统就有优先级,一些Java优先级会被映射到相同的级别,但是Sun JVM的Linux版本中,线程优先级被忽略,所有的线程都是一个优先级。
初级程序员通常会过度使用线程优先级。使用线程优先级的机会其实非常少。你的程序不应该依赖线程优先级实现正确的功能。

后台线程

你可以将一个线程设置为后台线程

t.setDaemon(true);

这种线程其实并非完全后台,后台只是表示他会为其他线程提供服务。比如,时钟线程向其他线程提供时钟信号。当只有后台线程运行时,JVM就停止了。
有些初学者会忽略后台线程的停止规则,但是,这有时很危险,后台线程永远不应该访问文件,连接数据库等,因为他随时可能停止,即使在操作的过程中,也有可能停止。

未处理异常的处理

线程的run方法没有办法抛出任何checked异常,但是它可以被unchecked异常停止,在这种情况下,线程结束。
然而,你没有办法使用catch语句处理能够被传播的异常。相反,在线程结束前,异常被传输到未处理异常处理器。
异常处理器必须实现Thread.UncaughtExceptionHandler接口。接口只有一个方法

void uncaughtException(Thread t, Throwable e);

你可以使用setUncaughtExceptionHandler()方法设置异常处理器。你也可以使用静态方法setDefaultUncaughtExceptionHandler()方法设置默认异常处理器。你可以在处理器中输出日志信息等。如果你不安装,默认处理器是null,但对于具体的线程,其处理器是这个线程的线程集合(ThreadGroup)对象。线程集合对象是用于管理一组线程的对象,默认情况下,你创建的线程属于同一个线程集合对象。你也可以自定义线程集合,后续会讲到。
ThreadGroup类实现了Thread.UncaughtExceptionHandler接口,它的uncaughtException方法执行以下过程。

  1. 如果线程集合有父集合,调用父集合的uncaughtException。
  2. 否则,如果Thread.getDefaultExceptionHandler返回非null值,则调用它。
  3. 否则,如果Throwable是一个ThreadDeath对象,不处理。
  4. 否则,线程名称和Throwable的调用堆栈会被打印到错误输出System.err;
    最终输出的调用堆栈你应该在很多地方都见过。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值