Java线程属性笔记
1、中断线程
当对一个线程调用interrupt方法时,就会设置线程的中断状态。这是每个线程都有的boolean状态。每个线程都应该不时地检查这个标志,以判断线程是否被中断。
要想得出是否设置了中断状态,首先调用静态的Thread.currentThread方法获得当前线程,然后调用isInterrupted方法:
while (!Thread.currentThread().isInterrupted() && more work to do)
{
do more work
}
但是,如果线程被阻塞,就无法检查中断状态。这里就要引入InterruptedException异常。当在一个被sleep或wait调用阻塞的线程上调用interrupt方法时,那个阻塞调用将被一个InterruptedException异常中断。
没有任何语言要求被中断的线程应当终止。中断一个线程只是要引起它的注意。被中断的线程可以决定如何响应中断。某些线程非常重要,所以应该处理这个异常,然后再继续执行。但是,更普遍的情况是,线程只希望将中断解释为一个终止请求。这种线程的run方法具有如下形式:
Runnable r = () -> {
try
{
...
while (!Thread.currentThread().isInterrupted() && more work to do)
{
do more work
}
}
catch(IntertuptedException e)
{
//线程在睡眠或等待期间被中断
}
finally
{
cleanup, if required
}
};
如果设置了中断状态,此时倘若调用sleep方法,它不会休眠。实际上,它会清楚中断状态并抛出InterruptedException异常。因此,如果你的循环调用了sleep,不要检测中断状态,而应当捕获Interrupted异常。
2、守护线程
可以通过调用 t.setDaemon(true); 将一个线程转换为守护线程。守护线程的唯一用途是为其他线程提供服务。
3、线程名
可以用 setName方法为线程设置任何名字。
4、未捕获异常的处理器
线程的run方法不能抛出任何检查型异常,但是,非检查型异常可能会导致线程终止。在这种情况下,线程会死亡。
不过,对于可以传播的异常,并没有任何catch子句。实际上,在线程死亡之前,异常会传递到一个用于处理未捕获异常的处理器。
这个处理器必须属于一个实现了Thread.UncaughtExceptionHandler接口的类。这个接口只有一个方法。
void uncaughtException(Thread t, Throwable e)
可以用setUncaughtExceptionHandler方法为任何线程安装一个处理器。也可以用Thread类的静态方法setDefaultUncaughtExceptionHandler为所有线程安装一个默认的处理器。
如果没有为单个线程安装处理器,那么处理器就是该线程的ThreadGroup对象。
ThreadGroup类实现了Thread.UncaughtExceptionHandler接口。它的uncaughtException方法执行以下操作:
- 如果该线程有父线程组,那么调用父线程组的uncaughtException方法。
- 否则,如果Thread.getDefaultExceptionHandler方法返回一个非null的处理器,则调用该处理器。
- 否则,如果Throwable是ThreadDeath的一个示例,什么都不做。
- 否则,将线程的名字以及Throwable的轨迹输出到System.err。
5、线程优先级
在Java程序设计语言中,每一个线程有一个优先级。默认情况下,一个线程会继承构造它的那个线程的优先级。可以用 setPriority方法提高或降低任何一个线程的优先级。可以将优先级设置为MIN_PRIORITY(在Thread类中定义为1) 与 MAX_PRIORITY(定义为10)之间的任何值。NORM_PRIORITY(默认优先级)定义为5。
每当线程调度器有机会选择新线程时,它首先选择具有较高优先级的线程。

浙公网安备 33010602011771号