2024年150道高频Java面试题(三十)

2024-04-17 08:20

本文主要是介绍2024年150道高频Java面试题(三十),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

59. runnable 和 callable 有什么区别?

RunnableCallable是Java中用于定义可以由线程执行的任务的接口。

  1. 返回值
    • Runnable不返回任何值。它的run()方法没有返回类型,即void
    • Callablecall()方法具有返回值。它可以返回任何类型的对象,也可以抛出异常。
  2. 异常处理
    • Runnablerun()方法不能抛出检查异常(checked exception)。任何发生的异常都需要在内部捕获。
    • Callablecall()方法可以抛出检查异常。
  3. 使用场景
    • Runnable通常用于简单的任务,不需要返回结果。
    • Callable通常用于需要返回结果或者抛出异常的任务。
  4. 执行方式
    • Runnable通常通过Thread类或ExecutorServiceexecute()方法执行。
    • Callable通常通过ExecutorServicesubmit()方法执行,submit()会返回一个Future对象,该对象表示任务的潜在结果。

下面是两个接口的代码示例:

// Runnable 示例
Runnable runnable = new Runnable() {@Overridepublic void run() {// 代码逻辑}
};// Callable 示例
Callable<String> callable = new Callable<String>() {@Overridepublic String call() throws Exception {// 代码逻辑return "Result";}
};

总结:

特性RunnableCallable
返回值
异常处理不能抛出检查异常可以抛出检查异常
使用场景简单任务需要结果或异常的任务
执行方式ThreadExecutorService.execute()ExecutorService.submit()

这两个接口都提供了定义任务的方法,但它们在返回值和异常处理方面有所不同,因此可以根据不同的需求选择合适的接口。

60. 线程有哪些状态?

线程在其生命周期中有几种不同的状态,这些状态描述了一个线程从创建到消亡的过程。以下是Java线程可能处于的状态:

  1. 新建(New)
    • 当一个线程被创建但尚未启动时,它处于新建状态。此时,线程已经存在,但是它的start()方法尚未被调用。
  2. 就绪(Runnable)
    • 一旦线程调用了start()方法,线程进入就绪状态,等待被线程调度器选中获取CPU的执行时间。在就绪状态,线程可能正在执行,也可能在等待CPU分配执行时间。
  3. 运行(Running)
    • 当线程调度器选中一个就绪状态的线程时,该线程进入运行状态,开始执行其run()方法中的代码。
  4. 阻塞(Blocked)
    • 当线程试图获取一个内部对象锁(例如进入一个同步块)而该锁被其他线程持有时,该线程进入阻塞状态。当锁被释放,并且该线程获得了锁,它将返回到就绪状态。
  5. 等待(Waiting)
    • 当线程等待另一个线程执行特定操作时,它进入等待状态。这通常发生在调用Object.wait()Thread.join()或者等待某些LockSupportparking操作时。
  6. 计时等待(Timed Waiting)
    • 和等待状态类似,但线程在等待其他线程执行操作时会等待一个指定的时间。进入计时等待状态的常见方法包括带有超时的Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis)等。
  7. 终止(Terminated)
    • 当线程的run()方法正常执行完毕,或者出现未捕获的异常导致线程提前终止,线程进入终止状态。

以下是一个简单的表格来总结上述状态:

状态名称描述
新建线程被创建但未启动
就绪线程准备好执行,等待CPU调度
运行线程正在执行
阻塞线程等待获取内部锁
等待线程无限期等待其他线程的操作
计时等待线程等待其他线程操作,但有超时时间
终止线程完成执行

理解这些状态对于并发编程非常重要,因为它们有助于开发者在编写多线程应用时诊断和解决线程同步和通信问题。

有帮助请点赞收藏呀~

领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。

这篇关于2024年150道高频Java面试题(三十)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/911279

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap