Thread的几个常见属性
1、Id
ID 是线程的唯一标识,由系统自动分配,不同线程不会重复。
2、Name名称
用户定义的名称。该名称在各种调试工具中都会用到。
3、State状态
状态表示线程当前所处的一个情况。和进程一样,线程也有状态,Java中对线程的状态又进一步的区分,表达得更加丰富。
- NEW(新建状态):Thread对象创建了,但是还没有调用start,内核中的线程还没创建。
- RUNNABLE(可运行状态):线程就绪(正在cpu上执行,或者等待调度)
- BLOCKED(阻塞状态):由于锁竞争引起的阻塞
- WAITING(等待状态):通过 wait/join 等不带时间的方法进入的阻塞。
- TIMED_WAITING(定时等待状态):通过 sleep 等带有时间的方法进入的阻塞。
- TERMINATED(终止状态):run方法执行完毕,内核中的线程已经销毁。
4、Priority优先级
顾名思义,但是在Java中设置优先级,效果可能不太明显(由于系统的随机调度)。
5、Daemon后台线程
Daemon后台线程,又称守护线程。与之对应的是前台线程。前台线程的运行,会阻止进程结束;后台线程的运行,不会阻止进程结束。jvm内置的线程都为后台线程。
public static void main(String[] args) { Thread t = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } }, "自定义线程名称"); t.start(); }
以上代码中,t 线程就属于前台线程
即点击执行后,main会直接执行完毕,而此时 t 线程仍然会一直循环打印"hello thread"
也证明了 t 线程阻止了进程的结束,因此就是前台线程。
public static void main(String[] args) { Thread t = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } }, "自定义线程名称"); t.setDaemon(true); //在start启动前,设置线程为后台线程 t.start(); }
此时 t 线程就无法阻止进程的结束
结果就是不会打印 "hello thread" 或者只打印了一次(因为随机调度)
6、Alive存活
alive存活,表示内核中的线程(PCB)是否还存在。
public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Runnable() { //此时只是有了t对象,但是内核pcb还没有 @Override public void run() { try { Thread.sleep(1000); //sleep一秒 } catch (InterruptedException e) { throw new RuntimeException(e); } } }, "自定义线程名称"); System.out.println(t.isAlive()); //false t.start(); //start后,才真正在内核中创建出pcb System.out.println(t.isAlive()); //true Thread.sleep(2000); //sleep两秒,等待t线程结束 System.out.println(t.isAlive()); //false }
t 线程执行完后,内核pcb也随之释放,但是当程序还未结束时,t 变量还存在,此时也为false