Java多线程面试题及答案(1-5)

1、什么是线程?如何创建线程?
答:线程是程序中的执行路径。Java 中可以通过继承 Thread 类或实现 Runnable 接口来创建线程。使用继承 Thread 类方式时,需要重写 run() 方法,并调用 start() 方法来启动线程;使用实现 Runnable 接口方式时,需要实现 run() 方法,并将其传递给 Thread 类的构造函数来创建线程。

2、线程有哪些状态?线程状态之间如何转换?
答:线程有 6 种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)和结束(Terminated)。线程状态之间的转换如下:

  • 当线程被创建时,处于新建状态;
  • 当调用 start() 方法时,线程进入就绪状态,等待系统调度执行;
  • 当线程获得 CPU 执行权后,进入运行状态;
  • 当线程在执行过程中发生阻塞(如等待 IO 操作)时,进入阻塞状态;
  • 当线程调用 sleep()、wait() 或 join() 方法时,进入等待状态;
  • 当线程执行完 run() 方法或者发生未捕获异常时,进入结束状态。

3、什么是 synchronized 关键字?它的作用是什么?
答:synchronized 关键字是 Java 中的同步锁,用来保证在同一时刻只有一个线程可以访问被同步的代码块。其作用是保证多线程环境下数据的安全性,避免出现线程安全问题。

4、什么是线程池?如何使用线程池?
答:线程池是一种用来管理线程的机制,它通过维护一定数量的线程来执行任务,从而避免了线程的创建和销毁带来的性能开销。在 Java 中,可以通过 Executors 工厂类来创建线程池。使用线程池的步骤包括:创建线程池、创建任务、将任务提交给线程池执行、关闭线程池。

5、什么是死锁?如何避免死锁?
答:死锁是指两个或两个以上的线程在执行过程中,因互相持有对方所需要的资源而相互等待的状态。为避免死锁,可以采取以下措施:

  • 避免一个线程同时获取多个锁;
  • 避免一个线程在持有锁的同时还去请求其他锁;
  • 尝试使用定时锁,使用 lock.tryLock(timeout) 替代使用内部锁机制;
  • 对于数据库锁,加锁和解锁要在一个数据库连接里,否则会出现锁无法释放的情况。