线程中的属性
线程各属性总览

线程Id、线程名字
线程是从1开始的,除主线程外,JVM虚拟机会开启一些额外的进程:Finalizer、Reference Handler、Signal Dispatcher、Attach Listener
/**
* 描述: ID从1开始,JVM运行起来后,我们自己创建的线程的ID早已不是2
*
* 主线程id 1
* t1的id 20
* t1的名字 Thread-0
* t1的名字 NewThreadT1
*/
public class Id {
public static void main(String[] args) {
Thread t1 = new Thread();
System.out.println("主线程id " + Thread.currentThread().getId());
System.out.println("t1的id " + t1.getId());
System.out.println("t1的名字 " + t1.getName());
//修改t1的名字
t1.setName("NewThreadT1");
System.out.println("t1的名字 " + t1.getName());
}
}
守护线程
守护线程是为了给用户线程提供服务的线程。
当运行的所有线程都是守护线程时,那么这些守护线程就会和JVM一起停止工作。否则JVM是不能自行停止运行的。
守护线程的三个特性
* 线程的类型默认继承自父线程:守护线程创建出来的线程自动就是守护线程。除非用setDaemon()可以将用户线程设置为守护先。
* 被谁启动:通常所有的守护线程都是由JVM自动来启动的。
* 不影响JVM退出:JVM想要退出的时候只看还有没有用户线程,不关心是否还有很多守护线程。
守护线程和普通线程的区别
- 整体无区别
- 唯一区别在于是否影响JVM退出
什么时候需要设置守护线程?
没有特殊情况就无需设置守护线程,因为设置成守护线程十分危险,会导致有线程不能完整执行 JVM 就强行退出的风险,会出现数据不一样。
线程的优先级
优先级设置可以为 1-10 的任一数值,默认创建的线程优先级为5;Thread 类中定义了三个线程优先级,一般情况下推荐使用这几个常量,不要自行设置数值。分别是:
- MIN_PRIORITY(1)
- NORM_PRIORITY(5)
- MAX_PRIORITY(10)
程序设计不应该依赖于优先级,不同操作系统的优先级是不一样的。优先级会被操作系统改变。
/**
* 线程优先级Demo
*/
public class PriorityDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
while (true) {
System.out.println(Thread.currentThread().getName());
}
}, "线程1");
Thread thread2 = new Thread(() -> {
while (true) {
System.out.println(Thread.currentThread().getName());
}
}, "线程2");
thread.setPriority(Thread.MIN_PRIORITY);
thread2.setPriority(Thread.MAX_PRIORITY);
thread.start();
thread2.start();
}
}
总结
