专栏首页RabbitMQ实战Java多线程:线程属性

Java多线程:线程属性

# 线程属性

  • 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

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

本文分享自微信公众号 - 喜欢天文(AllUnderControl),作者:UnderControl

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何停止/中断一个运行中的线程

    https://github.com/FutaoSmile/learn-thread/tree/master/src/main/java/com/futao/l...

    喜欢天文的pony站长
  • Java多线程:线程状态

    喜欢天文的pony站长
  • 《深入理解Java虚拟机》摘抄(1-3章)

    图片来源:https://docs.oracle.com/javase/8/docs/

    喜欢天文的pony站长
  • 40个Java多线程问题总结

    一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用...

    技术从心
  • 面试题系列:并发编程之线程池及队列

    用newCachedThreadPool()方法创建该线程池对象,创建之初里面一个线程都没有,当execute方法或submit方法向线程池提交任务时,会自动新...

    我的小熊不见了丶
  • Java高并发面试题

    线程安全类: 一个类是线程安全的是指, 在多线程进行调用时,不需要额外的同步和其他协调,类的行为任然是正确的.

    用户7625070
  • Java 线程池原理与使用

    在java 中我们会一般要求创建线程必须使用线程池,因为这样可以避免资源消耗,通过重复利用已经创建的线程来降低线程创建和销毁所造成的消耗, 其次当任务到达时任务...

    用户7625070
  • Java 多线程 Thread 和 Runnable

    多线程是并行计算实现的方式, 但是在单cpu中实际上没有真正的并行,只不过是多个任务通过cpu的快速轮转,产生多任务同一时间运行的错觉.而其中的任务就是进程. ...

    用户7625070
  • 一文探讨 RPC 框架中的服务线程隔离

    微服务如今应当是一个优秀的程序员必须学习的一种架构思想,而RPC框架作为微服务的核心,不说读一遍源码吧,起码它的实现原理还是应该知道的。

    kirito-moe
  • java 线程池设计模式

    进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地...

    用户7625070

扫码关注云+社区

领取腾讯云代金券