美文网首页
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并发编程(二)同步

    如果你的java基础较弱,或者不大了解java多线程请先看这篇文章java多线程(一)线程定义、状态和属性 同步一...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • 带你搞懂Java多线程(四)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三) 什么是线程间的协作 线程之间...

  • Java多线程:线程属性

    # 线程属性 id:线程唯一标识。自动生成。不允许修改。 name:线程的名字,可以自定义成有具体含义的名字,便于...

  • java多线程--Callable

    **移步[java多线程系列文章]Java多线程(二十二)---LockSupport工具Java 停止线程 一、...

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

网友评论

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

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