1.java守护线程和用户线程的区别
答:任何线程都可以设置为守护线程和用户线程,通过方法thread.setDeamon(线程),返回true则设置为守护线程,返回false则设置为用户线程;thread.setDeamon()在thread.start()方法前调用,否则会抛出异常。
守护线程与用户线程的主要区别:判断JVM何时撤离,守护线程为其他线程提供服务,如果用户线程全部撤离,守护线程没有可服务的线程,JVM只剩下守护线程,就会撤离;守护线程是JVM创建的线程(不一定),用户线程是程序创建的线程。
扩展
jstack -l <pid> | grep <thread-hex-id> -A 10
-l 长列表,打印关于锁的附加信息
-m 打印java和jni框架的所有栈信息
<pid> 进程id
<thread-hex-id> 系统线程id
-A 10 显示10行
线程名称----Thread-(数字),
线程类型(守护线程有deamon),
线程优先级----prio,
JVM线程id----tid,通过java.lang.Thread.getId()获取
系统线程id----nid,十六进制形式,通过top命令查看
系统线程状态----runnable
起始栈地址
JVM线程状态-----java.lang.Thread.State:RUNNABLE
线程调用栈详细信息----从下向上解读,因为程序调用是从下向上的
参考:JVM故障分析及性能优化系列之一:使用jstack定位线程堆栈信息
参考:Thread Dump日志信息
参考:学习java线程状态和看懂thread dump文件中的线程信息
参考:进程、线程状态查看命令:top、strace、pstack
参考:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
参考:jstack生成的Thread Dump日志线程 分析