1.线程状态
- New(新创建)
- Runnable(可运行)
- Blocked(被阻塞)
- Waiting(等待)
- Timed waiting(计时等待)
- Terminated(被终结)
当用new操作符创建一个新线程时,该线程还没有开始运行。一旦调用start方法,线程处于runnable状态。一旦一个线程开始运行,它不必始终保持运行。
运行中的线程被中断,目的是为了让其他线程获得运行机会。抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权,并给另一个线程运行。当选择下一个线程时,操作系统考虑线程的优先级。
所有的桌面以及服务器操作系统都使用抢占式调度,类似手机的小型设备可能使用协作式调度(被唤醒的高优先级任务不可以打断正在运行的低优先级任务)。
在具有多个处理器的机器上,每个处理器运行一个线程,可以有多个线程并行运行。如果线程的数目多于处理器的数目,调度器依然采用时间片机制。
线程因以下两个原因之一而被终止:
- 因run方法的正常退出而自然死亡
- 因为一个没有捕获的异常终止了run方法而意外死亡
2.线程属性
①线程优先级
每一个线程都有一个优先级。默认情况下,一个线程继承它的父线程的优先级。每当线程调度器有机会选择新线程时,它首先选择具有较高优先级的线程。
不要过度使用线程优先级。不要将程序构建为其功能的正确性依赖于优先级。
②未捕获异常处理器
线程run方法抛出非受查异常,会导致线程终止。但是,不需要任何catch子句来处理可以被传播的异常。在线程死亡之前,异常就被传递到一个用于未捕获异常的处理器。
该处理器必须属于一个实现Thread.UncaughtExceprionHandler接口的类。这个接口只有一个方法
void uncaughtException(Thread t, Throwable e)
可以用setUncaughtExceptionHandler方法为任何线程安装一个处理器。也可以利用Thread类的静态方法setDefaultUncaughtExceptionHandler为所有线程安装一个默认的处理器。
如果不安装默认的处理器,默认的处理器为空。如果不为独立的线程安装处理器,此时的处理器就是该线程的ThreadGroup(线程组)对象。
线程组是一个可以统一管理线程的集合。默认情况下,创建的所有线程属于相同的线程组。建议不要在自己的程序中使用线程组。
网友评论