其他面试题

你如何在Java中获取线程堆栈(Thread Dump)?

  • 当你获取线程堆栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台

  • 在Windows你可以使用Ctrl + Break组合键

  • Linux下用kill -3命令

  • 可以用jstack这个工具来获取,它对线程id进行操作,你可以用jps这个工具找到id。

有三个线程T1,T2,T3,怎么确保它们按顺序执行?

  • 用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行

  • 为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成

Thread类中的yield方法有什么作用?

  • Yield方法可以暂停当前正在执行的线程对象,让其它有相同优先级的线程执行

Java中ConcurrentHashMap的并发度是什么?

  • ConcurrentHashMap把实际map划分成若干部分来实现它的可扩展性和线程安全。

  • 这种划分是使用并发度获得的,它是ConcurrentHashMap类构造函数的一个可选参数,默认值为16,这样在多线程情况下就能避免争用

如何强制启动一个线程?

  • 这个问题就像是如何强制进行Java垃圾回收,目前还没有觉得方法,虽然你可以使用System.gc()来进行垃圾回收,但是不保证能成功。

  • 在Java里面没有办法强制启动一个线程,它是被线程调度器控制着且Java没有公布相关的API。

在多线程中,什么是上下文切换(context-switching)?

  • 下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行

如何确保main()方法所在的线程是Java程序最后结束的线程?

  • 使用Thread类的join()方法来确保所有程序创建的线程在main()方法退出前结束

为什么Thread类的sleep()和yield()方法是静态的?

  • Thread类的sleep()和yield()方法将在当前正在执行的线程上运行

  • 让sleep()成为实例方法, 当前线程可以直接sleep别的线程,

  • sleep()方法是当前线程转入被阻塞的状态,而yield()方法使当前线程转入可运行状态;

何创建守护线程?

  • 使用Thread类的setDaemon(true)方法可以将线程设置为守护线程

  • 当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程