线程属性包括:线程优先级、守护线程、线程组和处理未捕获异常的处理器。
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. **线程同步与互斥*...
该程序是我写的博客“一起talk C栗子吧(第一百二十回:C语言实例--线程属性)”的配套程序,共享给大家使用
线程属性是线程管理的关键部分,它们定义了线程的行为特性,如线程的分离状态、调度策略等。本篇文章将深入探讨Posix线程属性的细节。 首先,线程属性由`pthread_attr_t`结构体表示,使用前需要初始化,通常通过`...
本章主要讨论的是如何通过线程属性对象来定制线程的创建和行为,特别是针对Linux环境。 线程属性对象是一个重要的概念,它允许开发者指定不同于默认行为的线程属性。这些属性可以在创建线程时通过`pthread_create...
在标题提到的"四个显示线程计算结果的函数"中,这通常指的是在多线程环境下,如何在主线程(通常是UI线程)中安全地更新界面以展示从属线程计算的结果。 在描述中,提到的问题是关于从属线程如何在主界面上显示中间...
#### 四、多线程与定时器的关系 ##### 4.1 定时器的作用 定时器是一种特殊的系统资源,它可以定期向线程发送特定的消息。在MFC中,定时器通常用于周期性地执行某些任务或刷新用户界面,例如: - **启动定时器**:...
通过配置线程调度策略与优先级,可使各线程按照设定的顺序执行,从而达到线程间同步的目的,线程属性配置函数包括: pthread_attr_init(&attr[i]);// 初始化线程属性 pthread_attr_setschedpolicy(&attr[i], SCHED...
在创建joinable状态的线程时,可以通过标准的pthread_create()函数来完成,并传入PTHREAD_CREATE_JOINABLE作为线程属性。完成后,如果需要等待该线程结束,必须调用pthread_join()函数。以下是示例代码: ```c++ #...
线程相关属性包括线程ID、优先级、是否守护线程等。线程ID是系统分配的唯一标识符,用于区分不同的线程。线程优先级决定线程调度的顺序,但具体实现取决于操作系统的调度策略。守护线程是一种特殊类型的线程,当所有...
在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误。 下面介绍两种解决方案 第一种:使用控件自带的Invoke或者BeginInvoke方法。 Task....
这个函数需要四个参数:线程标识符的指针,线程属性(默认为NULL,表示使用默认属性),线程执行的函数指针,以及传递给线程函数的参数。创建成功时,函数返回0。 2. **线程等待** `pthread_join`函数用于等待一个...
LINUX 线程函数大全是一个详细的线程函数手册,涵盖了线程创建、线程属性、线程结束、线程等待、线程分离、线程数据等多方面的知识点。本手册将详细讲解每个线程函数的使用方法、参数设置、返回值等信息,从而帮助...
#### 四、线程属性 **属性对象** - 描述线程特性的对象。 **初始化属性** - 设置线程属性的初始值。 **销毁属性** - 清除不再需要的线程属性对象。 **设置分离状态** - 配置线程是否自动分离。 **获取分离...
其中,`Thread.IsAlive`属性是一个非常重要的成员,它允许开发者检查线程的当前状态,以确定线程是否已经启动并且仍在运行。在理解`Thread.IsAlive`属性的用法之前,我们需要先了解一些基本的线程概念。 1. **线程...
只能在创建线程的时候指定线程的属性,不能在线程运行时改变它的属性。 7. 线程数据 线程数据是被用来存储线程私有数据的。它像全局变量,能被某个线程调用的所有函数访问,但却是线程私有的,只能被特定线程访问...
这种方式的优点是每个线程有自己的实例,可以拥有自己的属性和方法,但缺点是每个线程类只能继承一个类,限制了类的继承性。 2. 实现Runnable接口: 创建一个实现了Runnable接口的类,然后在实现的`run()`方法中...