结果
主线程的ID1 子线程的ID11在执行子线程前,其实已经执行了很多线程,所以子线程名不是ID2
默认线程名字源码分析
public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } private static synchronized int nextThreadNum() { return threadInitNumber++; }对于一个没有指定名字的线程,初始化时会默认一个名字如上,由于nextThreadNum自增且被synchronized修饰,所以不会出现线程重名的情况。
修改线程名字
public final synchronized void setName(String name) { checkAccess(); if (name == null) { throw new NullPointerException("name cannot be null"); } this.name = name; if (threadStatus != 0) { setNativeName(name); } }线程内部的属性name 即使线程启动也可以修改 但是NativeName 前面有个判断,如果线程启动了就无法更改 所以如果启动线程后,忘记改线程名字,可以用setName进行更改 但是其在Native层的名字不会发生改变
作用:给用户线程提供服务 守护线程会和JVM一起停止工作 三个特性:
线程的类型默认继承自父线程(我们创建的线程为用户线程是因为我们的父线程为用户线程,守护线程同理,如果我们想创建守护线程,需要进行操作修改属性)被谁启动(通常而言是JVM启动,在JVM启动时会有一个非守护线程——main,其他均为守护线程)不影响JVM退出 对于JVM而言,退出时只看用户线程,不看守护线程守护线程与普通线程区别
整体无区别唯一的区别在于——JVM的离开守护线程与用户线程区别 整体上无太大区别,区别在于是否会影响到JVM的退出,它们作用不同,用户线程用于执行逻辑,守护线程是服务于我们的。
我们是否需要给线程设置为守护线程 不应该,一旦我们把自己的用户线程设置为守护线程,JVM一旦发现只有守护线程运行时,就会停止工作,代码强行终止
10个级别,默认5
程序设计不应该依赖优先级
不同操作系统不一样(JVM会将线程优先级映射到操作系统优先级上,会根据操作系统来调度,windows只有7个优先级,不是一一对应的关系,linux中优先级会被忽略,这样并不可靠)优先级会被操作系统改变(windows的优先级推进器会跨越优先级设置)