Thread类的对象中保存了一些属性信息能够帮助我们来辨别每一个线程,知道它的状态,调整控制其优先级。 这些属性是:
- ID: 每个线程的独特标识。
- Name: 线程的名称。
- Priority: 线程对象的优先级。优先级别在1-10之间,1是最低级,10是最高级。不建议改变它们的优先级,但是你想的话也是可以的。
Status: 线程的状态(即生命周期状态)。在Java中,线程只能有这6种中的一种状态:
- new(新建)
至今尚未启动的线程的状态,即没有调用start()方法。 - runnable(就绪)
处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。 - blocked(阻塞)
处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Object.wait 之后再次进入同步的块/方法。 waiting(无限期等待状态。)
某一等待线程的线程状态。某一线程因为调用下列方法之一而处于等待状态:- 不带超时值的 Object.wait
- 不带超时值的 Thread.join
- LockSupport.park
timed waiting(等待指定时间状态)
具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:- Thread.sleep
- 带有超时值的 Object.wait
- 带有超时值的 Thread.join
- LockSupport.parkNanos
- LockSupport.parkUntil
- terminated(死亡).
已终止线程的线程状态。线程已经结束执行。
- new(新建)
测试用例
Task类型实现Runnable接口,输出一些简单的信息:
public class Task implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
long duration = (long) (Math.random() * 10);
try {
TimeUnit.SECONDS.sleep(duration);
System.out.println(Thread.currentThread().getName() + " -> doTask -> " + i + " -> use -> " + duration );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
ThreadTest测试输出各线程的状态信息:
public class ThreadTest {
public static void main(String[] args) {
Thread[] threads = new Thread[10];
State[] states = new Thread.State[10];
//创建10个线程
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new Task());
if (i % 2 == 0) {
threads[i].setPriority(Thread.MAX_PRIORITY);
} else {
threads[i].setPriority(Thread.MIN_PRIORITY);
}
threads[i].setName("Thread - " + i);
}
// 输出并记录所有线程启动前的状态,他们都是NEW
System.out.println("当前所有线程的状态:");
for (int i = 0; i < threads.length; i++) {
System.out.println(threads[i].getName() + " -> " + threads[i].getState() + " -> " + threads[i].getPriority());
states[i] = threads[i].getState();
}
// 启动线程
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
System.out.println("线程启动后的状态变化:");
boolean finish = false;
while (!finish) {
for (int i = 0; i < 10; i++) {
if (threads[i].getState() != states[i]) {
System.out.println(threads[i].getName() + " -> state -> " + threads[i].getState());
states[i] = threads[i].getState();
}
}
finish = true;
for (int i = 0; i < 10; i++) {
finish = finish && (threads[i].getState() == State.TERMINATED);
}
}
}
}