06-线程相关属性

nobility 发布于 2021-05-02 2675 次阅读


线程相关属性

线程ID

每个线程都有唯一的ID,线程ID是没有setter方法的,也就是不能修改的,这是因为ID是给JVM使用的

  • 线程的ID是一个从1开始自增的序列,Main函数就是第一个线程
  • JVM在启动时除啦主线程还会自动启动很多其他辅助线程,由于线程的随机性即时自己创建的一个线程ID也可能不是2
public static void main(String[] args) {
  System.out.println("主线程ID" + Thread.currentThread().getId());
  System.out.println("自定义线程ID" + new Thread().getId());
}

线程名

  • 对于没有指定名字的非主线程会有一个以Thread-开头,从0开始的自增序列结尾的默认名字(主线程名是main)
  • 在源码中该自增序列使用了同步锁,所以默认名不会重名,虽然可以认为设置同名线程
  • 对于Java程序层的线程名是可以在线程启动后进行修改的,对于本地方法层的线程名是只能在构造函数中设置一次的,通过setter方法修改线程名是修改的Java程序层的线程名
public static void main(String[] args) {
  Thread t = new Thread("t");
  t.start();
  System.out.println(t.getName());  //初始线程名
  t.setName("tt");
  System.out.println(t.getName());  //修改后的线程名
}

守护线程

通常用于服务用户线程,守护线程有以下几个特性:

  • 线程类型默认继承父线程,也就是说由守护线程创建出的默认是守护线程,由用户线程创建出的线程默认是用户线程
  • 通常守护线程由JVM自动启动,main方法在运行时JVM还会自动启动很多守护线程
  • 所有非守护线程结束,守护线程自动结束

守护线程与普通线程整体上没有区别,只不过守护线程不会影响JVM的退出,一般也无需将用户线程手动设置为守护线程,因为守护线程的停止是JVM停止就突然停止,类似与stop()方法,无法完成一个基本单位的操作,会造成脏数据

线程优先级

Java中线程优先级分为10级别

  • 默认为5,最大为10,最小为1
  • 线程的优先级也会继承浮现出

不要依赖优先级,这是因为JVM会将优先级映射到操作系统上,对于不同的操作系统优先级级别并不相同,并且优先级可以被操作系统所修改(比如windows中优先级推进器功能会将非常想要执行的线程优先级提高),所以优先级并不可靠

此作者没有提供个人介绍
最后更新于 2021-05-02