Java多线程:6.线程的4个属性

一、线程的各个属性

  • 线程编号(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级上。但是操作系统也有可能忽略优先级的设定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章