线程属性整理

来源:互联网 发布:知到app下载安装 编辑:程序博客网 时间:2024/06/10 17:41

1、优先级

Thread的属性priority为优先级字段,在java中优先级从1到10依次提高,默认为5。

有长耗时的操作线程,一般建议设为 优先级,确保cpu资源不会被占用很久;

频繁阻塞(休眠或I/O)的线程设置为 优先级。

操作系统采用时间片(CPU 单次执行某线程的时间)的形式来调度线程的运行,线程被 CPU 调用的时间超过它的时间片后,就会发生线程调度。线程的优先级可以在一定程度上影响它得到时间片的多少,也就是被处理的机会。

2、守护线程

Java 中,线程也分三六九等。守护线程相当于小弟,做一些后台调度、支持性工作,比如 JVM 的垃圾回收、内存管理等线程都是守护线程。

Thread 中有个布尔值标识 daemon 当前线程是否为守护线程,daemon 属性需要在调用线程的 start() 方法之前调用。

一个进程中,如果所有线程都退出了,Java 虚拟机就会退出。注意了,这里的“所有”就不包括守护线程,也就是说,当除守护线程外的其他线程都结束后,Java 虚拟机就会退出,然后将守护进程终止。

这里需要注意的是,由于上述特性,Java 虚拟机退出后,在守护线程中的 finally 块中的代码不一定执行。

package com.thread;public class DeamonThreadTest {    static class DeamonThread extends Thread{        public void run() {            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } finally {                System.err.println(Thread.currentThread().getName() + " final block run...");            }        }    }    public static void main(String[] args) {        DeamonThread dt = new DeamonThread();        dt.setDaemon(true);        dt.start();    }}

上述代码中将线程设置为守护线程,由于 main 线程启动 DaemonThread 后就结束,此时虚拟机中没有非守护线程,虚拟机也会退出,守护进程被终止,但是它的 finally 块中的内容却没有被调用。

因此,守护线程中不能依靠 finally 块进行资源关闭和清理。

3、生命周期

线程状态 介绍 备注 NEW 新创建 还未调用 start() 方法;还不是活着的 (alive) RUNNABLE 就绪的 调用了 start() ,此时线程已经准备好被执行,处于就绪队列;是活着的 (alive) RUNNING 运行中 线程获得 CPU 资源,正在执行任务;(alive) BLOCKED 阻塞的 线程阻塞于锁或者调用了 sleep;(alive) WAITING 等待中 线程由于某种原因等待其他线程;(alive) TIME_WAITING 超时等待 与 WAITING 的区别是可以在特定时间后自动返回;(alive) TERMINATED 终止 执行完毕或者被其他线程杀死;(dead)

(待续)