线程属性概述
中断线程
守护线程
线程名
未捕获异常的处理器
线程优先级
中断线程
概述:
“中断”在计算机里是非常重要的概念,通过“中断”我们可以使软件快速响应用户,你也不想看到用户点击关闭之后,还要等所有代码彻底运行结束才关闭页面吧。
- 设置中断状态
interrupt( )
方法可以请求设置线程为中断状态,每个线程都有boolean标志,每个线程都会经常以这个标志来判断是否被中断,true表示如果这个线程已被中断; 否则false。
- 检查是否设置中断状态
- 先调用
Thread.currentThread( )
获取线程当前状态,然后调用isInterrupted( )
,测试这个线程是否被中断。
- 先调用
Runnable r = ->{
// You can decide how to respond to interrupt a thread
try{
while(!Thread.currentThread( ).isInterrupted( ) && more work to do){
do more work;
}
}
catch(InterruptedException e){
// 如果线程被阻塞(wait和sleep)就无法检查是否中断,所以调用InterruptedException异常中断。当线程被阻塞时,就可以强行异常中断。
}
}
守护线程
守护线程专门为其它的线程提供特定服务,就像一个尽职尽责的管家。比如GC垃圾回收系统,只要任何一个用户线程没有结束,GC系统就会继续运行。
通过调用
t.setDaemon(true);
将一个线程转换为守护线程(daemon thread)。
线程名
概述:通过调用setName()
设置线程名字
var t = new Thread(runnable);
t.setName("Java Thread") // 设置线程名字为Java Thread
未捕获异常的处理器
参考文章(点击跳转)
概述:
JVM的这种设计源自于这样一种理念:“线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”基于这样的设计理念
所以线程的run方法是不能向上抛出异常,只能在线程内处理。但是如果不能抛出异常,那么非检查型
的异常就可能会导致线程死亡/终止。但在线程死亡/终止之前,异常会传递到一个用于处理未捕获异常的处理器
。
// 未捕获异常的处理器必须实现这个接口
Interface Thread.UncaughtExceptionHandler{
void uncaughtException(Thread t, Throwable e)
// 当一个线程因未捕捉异常而终止时,要记录一个定制的报告
}
线程优先级
概述: 线程调度器
会优先调用级别高的线程。默认情况下,线程会继承构造它的那个线程的优先级。可以用 setPriority( )
来提高/降低 线程的优先级。
注:优先级低并不意味着不被执行,而是执行频率低。