logo

Java后端真实面试题大全

作者:很酷cat2024.01.05 16:08浏览量:15

简介:本文涵盖了Java后端面试中的常见问题,包括基础、数据结构与算法、Java多线程、并发、JVM、网络和数据库等。每个问题都配有详细的答案,帮助读者深入理解这些概念,从而更好地应对面试。

一、Java基础

  1. Java中实现多线程有几种方法?
    答:Java中实现多线程主要有三种方法:继承Thread类、实现Runnable接口和通过ExecutorService和Callable接口。
  2. 什么是继承Thread类?
    答:通过继承Thread类,我们可以创建一个新的线程类,并重写其run()方法。当线程启动时,会自动调用run()方法。
  3. 什么是实现Runnable接口?
    答:通过实现Runnable接口,我们可以创建一个实现了该接口的类,并重写其run()方法。该类可以被任何线程对象作为参数传递给线程的start()方法,并由线程自动调用run()方法。
  4. ExecutorService和Callable接口有何区别?
    答:ExecutorService是Java中的一个接口,用于管理线程池。它提供了多种方法来控制线程的执行,例如submit()和execute()方法。Callable接口是ExecutorService中的一个回调接口,用于异步执行任务并返回结果。与Runnable接口相比,Callable接口可以返回结果。
  5. 如何停止一个正在运行的线程?
    答:在Java中,我们不能直接停止一个正在运行的线程。但是,可以通过设置线程的interrupt状态或者使用volatile关键字来控制线程的执行。当一个线程检测到其interrupt状态被设置时,它可以选择停止执行或者进行清理操作。
  6. notify()和notifyAll()有什么区别?
    答:notify()方法用于唤醒一个在此对象监视器上等待的线程(即调用过wait()方法的线程),以便执行。如果所有等待的线程都在其他对象上等待,那么选择哪个线程继续执行的策略就不确定。而notifyAll()方法将唤醒所有在此对象监视器上等待的线程,以便所有等待的线程都可以有机会执行。
  7. sleep()和wait()有什么区别?
    答:sleep()方法是Thread类的一个静态方法,用于使当前线程暂停执行一段时间。而wait()方法是Object类的一个方法,用于使当前线程等待其他线程释放对象锁。当一个线程调用wait()方法时,它会释放当前对象锁,使其他线程可以获取该锁并执行。
  8. volatile是什么?可以保证有序性吗?
    答:volatile是Java中的一个关键字,用于声明一个变量为易变的,即每次访问该变量时都会重新读取它的值。这可以确保多个线程对该变量的访问不会出现竞态条件。但是,volatile不能保证内存屏障或指令重排,因此不能保证代码的有序性。
  9. Thread类中的start()和run()方法有什么区别?
    答:start()方法是Thread类的一个实例方法,用于启动新线程并自动调用run()方法。而run()方法是Thread类的一个抽象方法,需要在子类中重写实现具体逻辑。当直接调用run()方法时,该方法会在当前线程中同步执行,而不是启动新线程。
  10. 为什么wait(), notify()和notifyAll()这些方法不在Thread类里面?
    答:这些方法是Object类的方法,而不是Thread类的。因为这些方法是基于对象的监视器锁(monitor)机制实现的,而监视器锁是所有对象的内置锁。因此,这些方法可以在任何对象上被调用,而不仅仅是Thread对象。将它们放在Object类中可以方便地被其他类使用。

相关文章推荐

发表评论