`

(四) 线程属性

阅读更多

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

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上。

 

分享到:
评论

相关推荐

    C例子:线程属性

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

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

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

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

    这是一个很简单的线程项目,主要是跟踪了线程各个阶段的属性的状态,还有如何释放一个线程,很基础,下载请慎重!

    linux多线程编程

    线程属性 11 二、线程的分离状态 12 三、线程的继承性 13 四、线程的调度策略 13 五、线程的调度参数 14 六、线程的作用域 16 七、线程堆栈的大小 17 八、线程堆栈的地址 18 九、线程栈末尾的警戒缓冲区大小 18 第三...

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

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

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

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

    线程属性(linux内核)1

    见第 8 章。属性对象通过设置属性,可以指定一种不同于缺省行为的行为。使用 pthread_create(3C) 创建线程时,或初始化同步变量时,可以指定属性对

    多线程编程 线程基础 共享内存

    多线程从基础讲起,包括线程基础、线程属性、互斥量、共享内存、条件变量。

    C#通用的跨线程读写控件属性类

    用反射的方法实现的通用类,不用自己为每个控件每个属性去写一个委托

    Delphi多线程教程

    其各参数如它们的名称所说,分别是:线程属性(用于在NT下进行线程的安全属性设置,在9X下无效),堆栈大小, 起始地址,参数,创建标志(用于设置线程创建时的状态),线程ID,最后返回线程Handle。其中的起始...

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

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

    Solaris多线程编程指南

    第2 章讨论常规POSIX 线程例程,其中重点介绍如何创建具有缺省属性的线程。 第3 章介绍如何创建具有非缺省属性的线程。 第4 章介绍线程同步例程。 第5 章讨论为支持多线程而对操作环境进行的更改。 第6 章介绍多线程...

    Linux线程属性总结

    线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中。 //线程属性结构如下: typedef struct { int etachstate; //线程的分离状态 int schedpolicy; //线程调度策略 structsched_param ...

    C#多线程操作技术

    理解.NET中线程的属性和方法 创建和使用线程 理解线程的特点、优点及使用场合 在.NET程序设计中,线程是使用Thread类(或Timer类(线程计数器)、ThreadPool类(线程池))来处理的,这些类在System.Threading命名...

    基于c/c++的MFC的多线程

     LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL //线程的安全属性 );  工作者线程编程较为简单,只需编写线程控制函数和启动线程即可。下面的代码给出了定义一个控制函数和启动它的过程: //线程控制函数 UINT ...

    Visual Basic.NET线程参考手册

    2.1.1 Thread类 2.1.2 创建一个线程 2.1.3 ThreadStart委托和执行分支 2.1.4 线程的属性和方法 2.1.5 线程的优先级 2.1.6 计时器和回调 2.1.7 使用线程调节线程 2.2 线程的生存期 2.2.1 使线程睡眠 2.2.2 中断一个...

    linux系统下多线程编程文档资料

    线程属性 11 二、线程的分离状态 12 三、线程的继承性 13 四、线程的调度策略 13 五、线程的调度参数 14 六、线程的作用域 16 七、线程堆栈的大小 17 八、线程堆栈的地址 18 九、线程栈末尾的警戒缓冲区大小 18 第三...

    Posix线程编程指南.rar

    1.2 创建线程 1.3 线程创建属性 1.4 线程创建的Linux实现 2.线程取消 2.1 线程取消的定义 2.2 线程取消的语义 2.3 取消点 2.4 程序设计方面的考虑 2.5 与线程取消相关的pthread...

Global site tag (gtag.js) - Google Analytics