简介
本节来介绍下Java中线程的属性,即线程的编号(ID)、名称(Name)、守护线程(Daemon)、优先级(Priority),讲解下这些属性各自的作用,以及开发中需要注意的事项。
一.线程ID
线程的ID用于标识不同的线程,每个线程ID都不同,且不能够被修改。
我们创建的线程ID不是从2开始的递增的,因为JVM启动时会创建其他线程。
二.线程名称
让程序员在开发调试中,容易区分不同线程,定位问题而设立的属性
这个属性将是程序员唯一常用的线程属性,其他属性并不常用,甚至不应该使用。
线程创建后是可以修改名称的,但线程运行起来以后则不能再修改名称了
三.守护线程
守护线程作用是给用户线程提供服务的
如何设置守护线程
setDaemon(true)中,ture表示是守护线程,false表示是用户线程。必须在线程运行前才有效,否则无效
thread.setDaemon(true);
thread.start();
main函数是守护线程吗
不是,main函数是用户线程。
线程Debug状态下查看是否是守护线程
守护线程何时停止
在所有用户线程停止后,守护线程会和JVM一起停止运行。
例如:垃圾回收线程就是守护线程,它为用户线程提供服务,当JVM退出后,垃圾回收线程也将停止运行,不再消耗系统资源。
是否应该将线程设为守护线程
在开发中,应该尽量避免使用守护线程,而使用用户线程,因为守护线程在JVM离开后,代码将不执行,此时会造成数据不一致问题。
四.线程优先级
Java线程的优先级有10级,最小1级,最高10级,默认是5级。创建线程时,优先级自动继承父线程的优先级。
Java优先级定义源码
/**
* 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;
是否需要手动设置线程优先级?
不需要,因为优先级是有Java程序运行的系统决定的,并非设置了就会生效。不同的操作系统优先级和线程的优先级对应关系不同。如Linux是没有优先级概念的,所有线程优先级在Linux运行都一样。但在有些操作系统中,优先级是可以升级和降级的,所以,在编写代码时,最好不要指定优先级,采用默认即可。
总结
本文介绍线程的四个属性,其实除了线程名称属性,其他属性在编码过程中,是无需人为指定的。线程的ID、优先级和守护线程更多的是用作只读属性使用,并不需要手动修改默认配置。