`

(四) 线程属性

阅读更多

线程属性包括:线程优先级、守护线程、线程组和处理未捕获异常的处理器。

1.线程优先级
在Java程序设计语言中,每一个线程都有一个优先级。默认情况下,一个线程继承它的父线程的优先级。可以将优先级设置为MIN_PRIORITY(在Thread类中定义为1)与MAX_PRIORITY(定义为10)之间的任何值。
每当线程调度器有机会选择新线程时,它首先选择有较高优先级的线程。

注意:

(1)线程优先级是高度依赖于系统的。当虚拟机依赖于宿主机平台的线程实现机制时,JAVA的优先级被映射到宿主机平台的优先级上,优先级个数也许更多,也许更少。Windows有7个优先级别。Linux下线程的优先级被忽略--所有线程具有相同的优先级。
(2)如果有几个高优先级的线程没有进入非活动状态,低优先级的线程可能永远也不能执行。

2.守护线程
setDaemon(true) : 将线程转换为守护线程(daemon thread)。守护线程的唯一作用是为其他线程提供服务。当只剩下守护线程时,虚拟机就退出了。
注意:守护线程应该永远不去访问固有资源,如文件、数据库。因为它会在任何时候甚至在一个操作的中间发生中断。
e.g.计时线程定时发送“时间嘀嗒”信号给其他线程或清空过时的高速缓存项的线程。

3.未捕获异常处理器
原因:线程的run方法不能抛出任何被检测的异常,但是,不被检测的异常会导致线程终止。在这种情况下,线程就死亡了。
处理办法:不需要任何catch子句来处理可以被传播的异常。相反,就在线程死亡之前,异常被传递到一个用于未捕获异常的处理器。
未捕获异常的处理器:
(1).该处理器必须属于一个实现了Thread.UncaughtExceptionHandler接口的类。该类只有一个方法 void uncaughtException(Thread t, Throwable e)
(2).也可以用Thread类的静态方法setDefaultUncaughtExceptionHandler为所有的线程安装一个默认的处理器。

public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
	@Override
	public void uncaughtException(Thread t, Throwable e) {
		System.out.println("线程错误");
	}
}
 
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
 


替换处理器可以使用日志API发送未捕获异常的报告到日志文件。
如果不安装默认的处理器,默认处理器(getDefaultUncaughtExceptionHandler)为空。但是,如果不为独立的线程安装处理器(getUncaughtExceptionHandler),此时的处理器就是该线程的ThreadGroup对象。
注意 : 线程组是一个可以统一管理的线程集合。默认情况下,创建的所有线程属于相同的线程组,但是,也可能会建立其他的组。从Java SE 5.0起引入了更好的特性用于线程集合的操作。不要在自己的程序中使用线程组。
ThreadGroup类实现Thread.UncaughtExceptionHandler接口,它的uncaughtException方法做如下操作:

    public void uncaughtException(Thread t, Throwable e) {
	if (parent != null) {
	    parent.uncaughtException(t, e);
	} else {
            Thread.UncaughtExceptionHandler ueh = 
                Thread.getDefaultUncaughtExceptionHandler();
            if (ueh != null) {
                ueh.uncaughtException(t, e);
            } else if (!(e instanceof ThreadDeath)) {
		System.err.print("Exception in thread \""
				 + t.getName() + "\" ");
                e.printStackTrace(System.err);
            }
        }
    }
 

(1).如果该线程组有父线程组,那么父线程组的uncaughtException方法被调用。
(2).否则,如果Thread.getDefaultExceptionHandler方法返回一个非空的处理器,则调用该处理器
(3).否则,如果Throwable是ThreadDeath的一个实例,什么都不做。
(4).否则,线程的名字以及Throwable的栈踪迹被输出到System.err上。

 

分享到:
评论

相关推荐

    线程属性理解源码——属性、释放线程

    线程属性包括但不限于: 1. **线程优先级**:操作系统根据线程的优先级决定哪个线程优先获得CPU资源。不同的系统有不同的优先级范围,例如在Unix/Linux中,可以使用nice值来设置线程优先级。 2. **线程同步与互斥*...

    C例子:线程属性

    该程序是我写的博客“一起talk C栗子吧(第一百二十回:C语言实例--线程属性)”的配套程序,共享给大家使用

    Posix多线程编程—线程属性.doc

    线程属性是线程管理的关键部分,它们定义了线程的行为特性,如线程的分离状态、调度策略等。本篇文章将深入探讨Posix线程属性的细节。 首先,线程属性由`pthread_attr_t`结构体表示,使用前需要初始化,通常通过`...

    线程属性(linux内核)1

    本章主要讨论的是如何通过线程属性对象来定制线程的创建和行为,特别是针对Linux环境。 线程属性对象是一个重要的概念,它允许开发者指定不同于默认行为的线程属性。这些属性可以在创建线程时通过`pthread_create...

    C#多线程编程 四个显示线程计算结果的函数

    在标题提到的"四个显示线程计算结果的函数"中,这通常指的是在多线程环境下,如何在主线程(通常是UI线程)中安全地更新界面以展示从属线程计算的结果。 在描述中,提到的问题是关于从属线程如何在主界面上显示中间...

    MFC多线程的创建,包括工作线程和用户界面线程

    #### 四、多线程与定时器的关系 ##### 4.1 定时器的作用 定时器是一种特殊的系统资源,它可以定期向线程发送特定的消息。在MFC中,定时器通常用于周期性地执行某些任务或刷新用户界面,例如: - **启动定时器**:...

    C语言线程调度与优先级配置示例

    通过配置线程调度策略与优先级,可使各线程按照设定的顺序执行,从而达到线程间同步的目的,线程属性配置函数包括: pthread_attr_init(&attr[i]);// 初始化线程属性 pthread_attr_setschedpolicy(&attr[i], SCHED...

    C++ 如何正确的使用线程 释放线程资源

    在创建joinable状态的线程时,可以通过标准的pthread_create()函数来完成,并传入PTHREAD_CREATE_JOINABLE作为线程属性。完成后,如果需要等待该线程结束,必须调用pthread_join()函数。以下是示例代码: ```c++ #...

    进程与线程的案例,有同步、前后台线程、线程相关属性、有参线程和无参线程等众多案例

    线程相关属性包括线程ID、优先级、是否守护线程等。线程ID是系统分配的唯一标识符,用于区分不同的线程。线程优先级决定线程调度的顺序,但具体实现取决于操作系统的调度策略。守护线程是一种特殊类型的线程,当所有...

    C# 跨线程访问UI线程控件

    在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误。    下面介绍两种解决方案  第一种:使用控件自带的Invoke或者BeginInvoke方法。 Task....

    linux多线程设计及示例

    这个函数需要四个参数:线程标识符的指针,线程属性(默认为NULL,表示使用默认属性),线程执行的函数指针,以及传递给线程函数的参数。创建成功时,函数返回0。 2. **线程等待** `pthread_join`函数用于等待一个...

    LINUX线程函数大全.pdf

    LINUX 线程函数大全是一个详细的线程函数手册,涵盖了线程创建、线程属性、线程结束、线程等待、线程分离、线程数据等多方面的知识点。本手册将详细讲解每个线程函数的使用方法、参数设置、返回值等信息,从而帮助...

    多线程编程指南.pdf

    #### 四、线程属性 **属性对象** - 描述线程特性的对象。 **初始化属性** - 设置线程属性的初始值。 **销毁属性** - 清除不再需要的线程属性对象。 **设置分离状态** - 配置线程是否自动分离。 **获取分离...

    C#多线程之Thread中Thread.IsAlive属性用法分析

    其中,`Thread.IsAlive`属性是一个非常重要的成员,它允许开发者检查线程的当前状态,以确定线程是否已经启动并且仍在运行。在理解`Thread.IsAlive`属性的用法之前,我们需要先了解一些基本的线程概念。 1. **线程...

    Posix线程(经典)

    只能在创建线程的时候指定线程的属性,不能在线程运行时改变它的属性。 7. 线程数据 线程数据是被用来存储线程私有数据的。它像全局变量,能被某个线程调用的所有函数访问,但却是线程私有的,只能被特定线程访问...

Global site tag (gtag.js) - Google Analytics