Java并发编程面试题

1.java守护线程和用户线程的区别
答:任何线程都可以设置为守护线程和用户线程,通过方法thread.setDeamon(线程),返回true则设置为守护线程,返回false则设置为用户线程;thread.setDeamon()在thread.start()方法前调用,否则会抛出异常。
守护线程与用户线程的主要区别:判断JVM何时撤离,守护线程为其他线程提供服务,如果用户线程全部撤离,守护线程没有可服务的线程,JVM只剩下守护线程,就会撤离;守护线程是JVM创建的线程(不一定),用户线程是程序创建的线程。
扩展

  • jstack打印指定进程中线程信息:
jstack -l  | grep -hex-id> -A 10

-l 长列表,打印关于锁的附加信息
-m 打印java和jni框架的所有栈信息
 进程id
-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日志线程 分析

  • 守护进程
  • 守护进程本身就是一个子进程,当主进程需要将任务并发执行的时候,就需要开启子进程;
  • 当子进程执行任务的生命周期伴随主进程的生命周期时,就需要将该子进程做成守护进程;
  • 主进程的代码执行完毕后,守护进程此时就被回收,然后主进程等待其他非守护进程执行完毕后回收子进程的资源,才会结束。
  • 守护线程
  • 守护线程为当前进程其他线程服务,守护线程在当前进程的其他线程结束后,守护线程才会挂掉
  • 主线程等待所有自线程运行完毕后,守护线程此时被回收。主线程结束意味着进程结束,进程资源被回收
  • 主进程等待子进程结束是要回收子进程的资源;主线程等待子线程执行完毕后结束

参考:守护进程和守护线程的区别

你可能感兴趣的:(并发编程,测试开发面试题,并发编程)