多线程核心知识总结(六)——一网打尽线程属性

it2022-12-26  91

线程的各个属性

线程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()); } }

结果

主线程的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一旦发现只有守护线程运行时,就会停止工作,代码强行终止

线程优先级

/** * The minimum priority that a thread can have. */ public final static int MIN_PRIORITY = 1; /** * The default priority that is assigned to a thread. */ public final static int NORM_PRIORITY = 5; /** * The maximum priority that a thread can have. */ public final static int MAX_PRIORITY = 10;

10个级别,默认5

程序设计不应该依赖优先级

不同操作系统不一样(JVM会将线程优先级映射到操作系统优先级上,会根据操作系统来调度,windows只有7个优先级,不是一一对应的关系,linux中优先级会被忽略,这样并不可靠)优先级会被操作系统改变(windows的优先级推进器会跨越优先级设置)
最新回复(0)