一、线程的各个属性
- 线程编号(ID):
每个线程都有自己的ID,用户标识不同的线程。JVM就是通过这个ID来找到某个线程。 - 线程名称(Name):
可以让用户或开发者更容易定位问题。 - 是否是守护线程(isDaemon):
true代表这个线程是守护线;false代表这个线程是非守护线程,也就是用户线程。 - 优先级(Priority):
该属性目的是告诉线程调度器,用户希望哪些线程能多运行,哪些线程能少运行。
二、线程ID
1.演示
/**
* 线程ID:
* 线程ID是从1开始自增的,但是JVM运行后,我们创建的线程的ID早已大于2
*/
public class ThreadPropers {
public static void main(String[] args) {
System.out.println("主线程的线程ID:"+Thread.currentThread().getId());
Thread thread = new Thread();
System.out.println("我们自己创建的线程的ID:"+thread.getId());
}
}
因为JVM在后面创建了其他线程。
三、线程名字
1.线程默认的名字的源码实现
默认即 ‘Thread-’ + ID。
2.修改线程的源码
需要注意的是:
- 线程有一个java层的名字,也就是Thread的name属性,这个属性在任何时候都能修改。
- 但是一旦线程启动了,也就是threadStatus!=0了,线程的native层的名字就不能修改了。
四、守护线程
1.用户线程和守护线程
守护线程不能阻止JVM的关闭,当JVM发现所有的线程都是守护线程了,就直接和守护线程关闭了。
2.作用
给用户线程提供服务,比如垃圾处理器。
3.守护线程的3个特性
- 守护线程的类型默认继承自父线程。
我们使用new Thread()创建的线程是一个用户线程,这是因为我们的主线程就是一个用户线程,new Thread()创建出的子线程会继承父线程的类型。同样,守护线程创建出的线程,也是守护线程。要用户线程创建守护线程,需要手动修改线程的属性,但是不应该这样做。 - 通常而言,所有的守护线程都是由JVM自动启动的,而不是由用户线程启动的。
- 不影响JVM的退出,当JVM要退出时,只关注用户线程是否结束。
4.守护线程和用户线程的区别
- 整体上无区别
- 唯一的区别在于是否影响JVM的区别
五、线程的优先级
1.简介
JAVA的线程优先级有10个级别,默认是5,因为主线程的优先级默认是5,所以创建的子线程也自动继承父线程5。
2.代码的设计不应该依赖于优先级
- 不同的操作系统不一样
- 优先级会被操作系统改变
例如windows中的优先级推进器,它发现某个线程一直想执行,则会越过优先级设定,优先给它分配时间。这样之前依赖优先级的逻辑就会被打破。
六、常见的面试问题
1.什么时候我们需要设置守护线程?
通常情况下我们不需要设置守护线程,JVM提供的守护线程足够我们使用。
2.如何使用优先级来帮助程序的运行?
我们不应该使用优先级来设定程序的运行,因为不同的操作系统不一样。
3.不同的操作系统如何处理优先级问题?
不同的操作系统有不同的优先级等级,例如windows系统中优先级的等级是7级,JVM会将JAVA中的10级映射到windows中的7级上。但是操作系统也有可能忽略优先级的设定。