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) |
(待续)