start()
之前设置这个属性,线程运行中设置线程守护属性会抛出异常。
/* 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自增。"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
欢迎在评论区留下你看文章时的思考,及时说出,有助于加深记忆和理解,还能和像你一样也喜欢这个话题的读者相遇~