线程4个属性

线程4个属性

线程ID

线程ID:每个线程都有自己的ID,用来标识不同的线程。JVM就用ID辨识线程,这个属性虽然在每一次JVM启动是唯一的,下一次创建线程,它又会从1开始往上编号,所以同一个ID会被先后不同的线程使用,唯一性不能保证;ID不允许被修改。ID是从1开始,并自增的,JVM运行起来后,我们自己创建的线程ID早已经不是1也不等于2,因为JVM 会自动创造一些线程,比如去做初始化、gc等。Thread.currentThread().getId();

线程Name

线程Name:作用是让程序员在开发、调试或运行过程中,更容易区分每个不同的线程、定位问题。如果我们不指定线程名,他就会自动生成Thread-nextThreadNum,nextThreadNum即threadInitNumber是自增的,并且被synchronized修饰,所以不会重复。也可以使用setName()设置线程名字。

是否是守护线程(isDaemon)

  • 是否是守护线程(isDaemon):true代表是【守护线程】,false代表是非守护线程,也就是【用户线程】。
  • 守护线程作用是给用户线程提供服务,守护的是用户线程。它不影响JVM结束运行,当用户线程都结束了,它会和JVM一起结束。
  • 守护线程三个特性:
    1. 线程类型默认继承自父线程,即守护线程创建的线程也是守护线程,
    2. 被谁启动,通常守护线程都是由JVM启动,在JVM启动的时候只有一个非守护线程,就是main线程,其他的都是守护线程。
    3. 不影响JVM的退出,JVM想退出的时候只看有没有用户线程,不看有没有守护线程。

优先级(Priority)

优先级(Priority):优先级这个属性的目的是告诉线程调度器,用户希望哪些线程相对多运行、哪些少运行。一共1到10,10 种优先级,未经修改的情况下都是5。
程序设计不应该依赖于优先级。因为:

  1. 不同的操作系统对优先级的理解不一样,而优先级是高度依赖操作系统的,比如java有10种优先级,而window系统只有7个优先级,linux中它会忽略优先级,所有优先级都一样。这是不可靠的,所以一般我们使用默认的第5级就可以了。
  2. 优先级会被操作系统修改,比如window中会有一个优先级推进器的功能。当它发现某个线程特别努力想执行,它会越过优先级给它优先分配时间,这样一来我们设置的优先级就失去了作用,所以我们使用优先级实现的逻辑代码,就会变得不可靠。还有就是如果有的线程设置优先级太低,当一直有优先级高的线程在,操作系统可能不会给它分配资源,导致它饿死,专业术语称之为饥饿。

常见面试题:

  • 守护线程和普通线程异同

    1. 整体上无区别,虽然名字不同,但是它们都是线程,都去执行代码,只不过代码的任务不一样,用户线程是执行我们的逻辑的,守护线程是服务我们的。
    2. 唯一的区别在于是否影响JVM的离开。
  • 我们是否需要给线程设置为守护线程
    我们不应该考虑需不需要,而是考虑应不应该,答案是不应该,因为我们设置自己的线程为守护线程,这个行为的危险的,比如我们自己设置的守护线程正在执行一些io操作,JVM发现正在运行的线程只剩下守护线程了,可能就停止运行了,就会导致我们的任务执行中断,出现数据不同步等问题。

上篇:Thread的常用方法sleep和join详解
下篇:处理多线程子线程的异常UncaughtExceptionHandler

你可能感兴趣的:(线程并发,java,多线程)