2026世界杯_2004年世界杯 - 1606811.com

首页 > 开幕式世界杯 > Java多线程:线程属性

Java多线程:线程属性

# 线程属性id:线程唯一标识。自动生成。不允许修改。name:线程的名字,可以自定义成有具体含义的名字,便于识别不同作用的线程。(可同名)isDaemon:是否是守护线程。true=守护线程,false=用户线程。当JVM中所有的线程都是守护线程,JVM将退出。具有代表性的线程: main线程:用户线程,gc线程:守护线程。子线程会默认继承父线程的这个属性。必须在调用start()之前设置这个属性,线程运行中设置线程守护属性会抛出异常。priority线程优先级。优先级高的线程概率上会优先运行。并不可靠.Java中的线程优先级有10个,默认是5,且子线程会继承父线程的优先级。不可靠:java中的线程优先级有10个,但是OS的线程优先级并不一定是10个,所以存在java中好几个优先级对应OS中的同一个优先级,不可靠。程序不应该依赖优先级。优先级一般默认设置成5即可。# ID源码代码语言:javascript复制

/* 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()为线程安全的一个自增。代码语言:javascript复制 private static synchronized int nextThreadNum() {

return threadInitNumber++;

}

还可以通过thread.setName()设置线程名称。# 代码演示代码语言:javascript复制/**

* @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

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




中国家电“竞逐”世界杯:谁在砸钱,谁在出圈?
运营的工作内容有哪些?一篇讲透这个“打杂又核心”的岗位!