美文网首页
Java多线程:线程属性

Java多线程:线程属性

作者: 垃圾简书_吃枣药丸 | 来源:发表于2020-06-21 12:08 被阅读0次

    # 线程属性

    • 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

    • 源码:


      image.png
    • 如果没有指定线程的名称,则默认是"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

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

    # 系列文章

    相关文章

      网友评论

          本文标题:Java多线程:线程属性

          本文链接:https://www.haomeiwen.com/subject/vcgoxktx.html