1、什么时候需要设置守护线程
2、如果应用线程优先级来帮助程序运行?有哪些注意点?
3、不同的操作系统如何处理优先级问题?
线程各属性

- 线程id 一定是从1开始的,但是JVM运行后,但自己创建的线程id早就不是2了。
获取id的方法
/**
* 描述: ID从1开始,JVM运行起来后,我们自己创建的线程的ID早已不是2.
*/
public class Id {
public static void main(String[] args) {
Thread thread = new Thread();
System.out.println("主线程的ID"+Thread.currentThread().getId());
System.out.println("子线程的ID"+thread.getId());
}
}
可以看到结果,咦,子线程的id直接跑到了11,意味着jvm在执行过程中,创建了其他的线程。


而为什么id是从1开始的呢,看看Thread()中的源码,一目了然
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
- 线程名字
最好自定义与功能相关的名字,便于打日志进行调试、分析。
默认名字可以从Thread()源码看成出public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); },这个nextThreadNum呢,是这样的
/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
因为加了synchronized,所以不会重名。
如果在初始化时没有给线程命名,可以用setName()去命名。
- 守护线程 作用:给用户线程提供服务
特性:
1、线程类型默认继承自父线程
2、被谁启动(通常都是jvm自动启动的而不是由用户启动的,在jvm启动时,只有main是非守护线程,其他都是守护线程)
3、不影响JVM退出
4、与普通线程整体没有什么区别,也就是是否影响jvm退出。
5、不应该把自己的线程设置为守护线程(比如有个线程是处理数据的,如果只剩下这个线程了,但它又被设置为守护线程,那么JVM发现,咦只有守护线程了,就把程序退出了,就会导致数据的不一致),JVM自身提供的守护线程已经足够了
- 线程优先级
10个级别,默认为5
程序设计不应该依赖于优先级
1、不同操作系统是不一样的
2、优先级会被操作系统改变