# 线程属性
id:
线程唯一标识。自动生成。不允许修改。
name:
线程的名字,可以自定义成有具体含义的名字,便于识别不同作用的线程。(可同名)
isDaemon:
是否是守护线程。
true=守护线程,false=用户线程。
当JVM中所有的线程都是守护线程,JVM将退出。
具有代表性的线程: main线程:用户线程,gc线程:守护线程。
子线程会默认继承父线程的这个属性。
必须在调用
start()之前设置这个属性,线程运行中设置线程守护属性会抛出异常。priority
线程优先级。
优先级高的线程概率上会优先运行。并不可靠.
Java中的线程优先级有10个,默认是5,且子线程会继承父线程的优先级。
不可靠:java中的线程优先级有10个,但是OS的线程优先级并不一定是10个,所以存在java中好几个优先级对应OS中的同一个优先级,不可靠。
程序不应该依赖优先级。
优先级一般默认设置成5即可。
# ID
源码
/* For generating thread ID / private static long threadSeqNumber; private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inheritThreadLocals) { ... / Set thread ID */ tid = nextThreadID(); ... } private static synchronized long nextThreadID() { return ++threadSeqNumber; }
线程初始化方法
init()会给线程设置id,该id通过被synchronized标记的nextThreadID()方法获取,id自增。
# NAME
源码:

如果没有指定线程的名称,则默认是
"Thread-" + nextThreadNum()。nextThreadNum()为线程安全的一个自增。private static synchronized int nextThreadNum() { return threadInitNumber++; }
还可以通过
thread.setName()设置线程名称。
# 代码演示
/** * @author 喜欢天文的pony站长 * Created on 2020/6/16. */public class ThreadProperties {    private static final Logger LOGGER = LoggerFactory.getLogger(ThreadProperties.class);    public static void main(String[] args) {        Thread mainThread = Thread.currentThread();        Thread childThread = new Thread(() -> {            try {                TimeUnit.SECONDS.sleep(2L);            } catch (InterruptedException e) {                e.printStackTrace();                Thread.currentThread().interrupt();            }        });        //必须在start()之前设置线程的优先级        //childThread.setDaemon(true);        childThread.start();        LOGGER.info("main线程的id:{}", mainThread.getId());        LOGGER.info("子线程的id:{}", childThread.getId());        LOGGER.info("main线程的名字:{}", mainThread.getName());        LOGGER.info("子线程的名字(修改之前):{}", childThread.getName());        childThread.setName("childThread-1");        LOGGER.info("子线程的名字(修改之后):{}", childThread.getName());        LOGGER.info("main线程是否是守护线程{}", mainThread.isDaemon());        LOGGER.info("子线程线程是否是守护线程{}", childThread.isDaemon());        //不能在线程运行过程中设置线程的优先级        childThread.setDaemon(true);        LOGGER.info("子线程线程是否是守护线程{}", childThread.isDaemon());    }}
- 结果
 

image.png
欢迎在评论区留下你看文章时的思考,及时说出,有助于加深记忆和理解,还能和像你一样也喜欢这个话题的读者相遇~
# 系列文章

image.png
本文分享自微信公众号 - 喜欢天文(AllUnderControl)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
 
 
 
 
 