赶紧收藏!2024 年最常见 100道 Java 基础面试题(二十)

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(十九)-CSDN博客

三十九、RunnableCallable有什么区别?

RunnableCallable都是Java中用于创建线程的任务接口,但它们之间存在一些关键的区别:

  1. 返回类型

    • Runnable接口的run()方法没有返回类型,它通常用于执行某些操作而不返回结果。
    • Callable接口的call()方法返回一个泛型类型,可以返回执行结果。
  2. 异常

    • Runnablerun()方法不声明抛出任何异常,这意味着它不能抛出未检查异常(unchecked exceptions)。
    • Callablecall()方法可以抛出异常,包括未检查异常和检查异常(checked exceptions),这使得Callable在处理异常时更加灵活。
  3. Future

    • Callable任务经常与FutureFutureTask结合使用,允许开发者获取任务的执行结果,或者在任务完成前取消任务。
    • Runnable任务不与Future结合,因此无法获得任务的执行结果或取消任务。
  4. 线程池

    • 在使用线程池(如ExecutorService)时,Callable任务可以通过Future对象来查询任务状态、取消任务或获取任务返回值。
    • Runnable任务在线程池中通常通过submit()方法提交,并且可以返回一个Future对象,但任务本身不直接返回结果。
  5. 内部类

    • 如果任务是一个类内部的逻辑,并且该逻辑不需要返回结果,那么实现Runnable接口可能更方便。
    • 如果任务需要返回结果,或者需要抛出异常,那么实现Callable接口可能更合适。
  6. 示例代码

  7. // Runnable示例
    class MyRunnable implements Runnable {
        public void run() {
            // 执行任务,无返回值
        }
    }
    
    // Callable示例
    class MyCallable implements Callable<String> {
        public String call() {
            // 执行任务并返回结果
            return "任务结果";
        }
    }
    
    // 使用ExecutorService提交任务
    ExecutorService executor = Executors.newFixedThreadPool(3);
    Future<String> future = executor.submit(new MyCallable());
    String result = future.get(); // 等待任务完成并获取结果
    executor.shutdown();

总结

  • Runnable适用于不需要返回结果的线程任务。
  • Callable适用于需要返回结果或处理异常的线程任务。
  • Callable任务与Future结合使用,可以提供任务执行的更多控制,如查询状态、取消任务或获取结果。

四十、线程有哪些状态?

在Java中,线程(Thread)在其生命周期中会经历不同的状态。根据Java虚拟机(JVM)的规范,线程的状态可以分为以下几个:

  1. 新建(New): 线程对象创建后,但还未调用start()方法之前,线程处于新建状态。

  2. 可运行(Runnable): 线程对象调用了start()方法后,线程进入可运行状态。在可运行状态的线程可能正在执行,也可能正在等待CPU资源来执行。

  3. 阻塞(Blocked): 当线程等待某个资源(如等待进入同步代码块或等待I/O操作完成)时,它将从可运行状态进入阻塞状态。

  4. 无限期等待(Waiting): 线程因为等待其他线程执行特定操作(如等待某个条件变量或等待join()操作)而进入无限期等待状态。线程在这个状态下需要其他线程的交互才能唤醒。

  5. 限期等待(Timed Waiting): 线程在执行操作时指定了超时时间,如调用了sleep(long millis)wait(long timeout)join(long millis)LockSupport.parkNanos()等方法,线程将进入限期等待状态。超时时间到达后,线程会自动唤醒,回到可运行状态。

  6. 终止(Terminated): 线程执行完run()方法中的所有操作,或者因为异常退出了run()方法,此时线程进入终止状态。

状态转换

  • 新建 -> 可运行:调用线程对象的start()方法。
  • 可运行 -> 阻塞:线程试图获取一个同步锁或执行了阻塞I/O操作。
  • 可运行 -> 无限期等待:线程执行了wait()join()LockSupport.park()方法。
  • 可运行 -> 限期等待:线程执行了sleep(long millis)join(long millis)LockSupport.parkNanos()LockSupport.parkUntil()方法。
  • 限期等待 -> 可运行:超时时间到达或被interrupt()方法中断。
  • 无限期等待 -> 可运行:线程被其他线程唤醒或被interrupt()方法中断。

示例代码

public class ThreadStateExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            synchronized (ThreadStateExample.class) {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        ThreadStateExample.class.wait(); // 无限期等待
                    } catch (InterruptedException e) {
                        break; // 被中断,退出循环
                    }
                }
            }
        });

        thread.start(); // 新建 -> 可运行

        synchronized (ThreadStateExample.class) {
            ThreadStateExample.class.notify(); // 唤醒等待的线程
        }

        try {
            Thread.sleep(1000); // 主线程限期等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        thread.interrupt(); // 中断线程,使其从等待状态唤醒
    }
}

总结

  • 线程在生命周期中会经历不同的状态,从新建到终止。
  • 线程状态的变化是由线程执行的操作和JVM的线程调度器共同决定的。
  • 了解线程状态及其转换对于编写多线程程序和进行性能调优非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/585634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql 从小白到高手 十一 :数据迁移ETL方案

文章目录 Postgresql 数据迁移ETL方案1、Pg 同类型数据库2 、Pg 和 不同数据库 Postgresql 数据迁移ETL方案 1、Pg 同类型数据库 备份 : pg_dump -U username -d dbname -f backup.sql插入数据&#xff1a; psql -U username -d dbname -f backup.sqlpg_restore -U username…

远程桌面连接服务器怎样连接不上的六个常见原因

远程桌面连接服务器无法连接的问题可能由多种原因引起。以下是一些常见的问题及其解决方案&#xff1a; 1. 网络连接问题&#xff1a;远程桌面连接的基础是稳定的网络连接。如果网络连接不稳定或中断&#xff0c;那么你将无法连接到远程桌面。检查你的网络连接&#xff0c;确保…

Codigger数据篇(中):数据可控性的灵活配置

在数据服务领域中&#xff0c;数据可控性无疑是至关重要的一环。数据可控性不仅关乎数据的安全性和隐私性&#xff0c;更直接影响到数据价值的实现。Codigger&#xff0c;在其数据可控性方面的灵活配置&#xff0c;为用户提供了更加便捷、高效的数据管理体验。 一、自主选择数…

Spring6 当中 Bean 的生命周期的详细解析:有五步,有七步,有十步

1. Spring6 当中 Bean 的生命周期的详细解析&#xff1a;有五步&#xff0c;有七步&#xff0c;有十步 文章目录 1. Spring6 当中 Bean 的生命周期的详细解析&#xff1a;有五步&#xff0c;有七步&#xff0c;有十步每博一文案1.1 什么是 Bean 的生命周期1.2 Bean 的生命周期 …

ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

1 漏洞描述 ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前&#xff0c;存在一处本地文件包含漏洞。当ThinkPHP开启了多语言功能时&#xff0c;攻击者可以通过lang参数和目录穿越实现文件包含&#xff0c;当存在其他扩展模块如 pear 扩展时&#xff0c;攻击者可…

esp32学习

开启自动补全功能 Arduino IDE 2.0开启代码补全及修改中文_arduino ide怎么设置中文-CSDN博客 PWM 、 ADC转换 在使用这个adc默认配置的时候adc引脚的输入电压必须是介于0-1之间&#xff0c;如何高于1v的电压都会视为一个最高值&#xff0c;如果要增加测量电压你就需要配置一…

【JAVA】part5-Java集合

Java 集合 Java集合概述 Java数组的局限性 数组初始化后大小不可变&#xff1b;数组只能按索引顺序存取。 Java的java.util包主要提供了以下三种类型的集合&#xff1a; List&#xff1a;一种有序列表的集合&#xff0c;例如&#xff0c;按索引排列的Student的List&#xff1b…

车载气象站:可移动监测的气象站

TH-CZ5车载气象站是一种专门针对车辆、船舶等应急环境检测设备而设计的可移动监测的气象站。 一、系统介绍 车载气象站系统采用先进的高精度GPS及三轴电子罗盘&#xff0c;可实现车行驶时的风速、风向检测。整机为野外型设计&#xff0c;同时还可对气温、相对湿度、雨量、气压…

Linux修改文件权限命令 chmod

【例子引入】 以下面命令为例&#xff1a; chmod 777 Random.py 当写入下面名为Random.py的代码后&#xff1a; 如果直接运行&#xff0c;会显示权限不够 当输入 chmod 777 Random.py 更改权限后&#xff0c;才能够正常运行 在终端中输入 这条命令是关于Linux或Unix-like系…

FlaUI

FlaUI是一个基于微软UIAutomation技术&#xff08;简称UIA&#xff09;的.NET库&#xff0c;它主要用于对Windows应用程序&#xff08;如Win32、WinForms、WPF、Store Apps等&#xff09;进行自动化UI测试。FlaUI的前身是TestStack.White&#xff0c;由Roemer开发&#xff0c;旨…

Socket编程--TCP连接以及并发处理

流程图 网络传输流程&#xff1a; TCP连接&#xff1a; api 客户端&#xff1a; socket: 创建套接字 domain: AF_INET &#xff1a;IPv4 type: SOCK_STREAM(tcp)、SOCK_DGRAM&#xff08;udp&#xff09; protocol: 0 默认协议 返回值&#xff1a;成功返回一个新的套接字…

Linux-进程间通信(进程间通信介绍、匿名管道原理及代码使用、命名管道原理及代码使用)

一、进程通信介绍 1.1进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某…

值得买科技新思路,导购电商的终点是“AI+出海”?

在以往&#xff0c;大众普遍认为品牌的消费者大多是高度忠诚人群&#xff0c;而事实上&#xff0c;非品牌忠诚者相比重度消费者&#xff0c;对促进品牌增长更为重要。 这类非品牌忠诚者被定义为摇摆的消费者群体&#xff0c;也就是那些购买品牌产品概率在20%-80%之间的消费者。…

【Unity动画系统】Animator组件的属性

介绍Animator组件的全部属性 Controller&#xff1a;动画控制器 Avatar&#xff1a;人物骨骼 Apply Root Motion&#xff1a;有一些动画片段自带位移&#xff0c;如果希望自带的位移应用在游戏对象上&#xff0c;那么就勾选&#xff1b;如果自己编写脚本&#xff0c;那么就不…

如何用智能获客开启新商机?揭秘赢销侠软件的奇效

在当今数字化竞争日益激烈的商业环境中&#xff0c;企业为了生存和发展&#xff0c;必须寻找新的途径以获取潜在客户。智能获客作为一种新型的营销方式&#xff0c;正以其高效、精准的特点改变着传统的市场开拓模式。而在这个过程中&#xff0c;自动获客软件的作用愈发凸显&…

LLM大语言模型原理、发展历程、训练方法、应用场景和未来趋势

LLM&#xff0c;全称Large Language Model&#xff0c;即大型语言模型。LLM是一种强大的人工智能算法&#xff0c;它通过训练大量文本数据&#xff0c;学习语言的语法、语义和上下文信息&#xff0c;从而能够对自然语言文本进行建模。这种模型在自然语言处理&#xff08;NLP&am…

杰发科技AC7840——SPI通信简介(1)_跑通Demo

0. 简介 一些配置项&#xff1a; CPHA&#xff1a;相序 CPLO&#xff1a;极性 看着demo需要按键&#xff0c;于是去掉按键&#xff0c;去掉打印&#xff0c;直接输出波形看逻辑分析仪的信号。 其实现在做这些demo测试应该都有逻辑分析仪&#xff0c;直接看波形更直观一点。…

分享:抖音老阳口中的选品师项目好做吗?

近年来&#xff0c;随着抖音等短视频平台的兴起&#xff0c;越来越多的博主通过分享自己的生活、知识和见解吸引了大量粉丝。其中&#xff0c;抖音博主老阳以其独特的选品眼光和专业的产品评测&#xff0c;在广大网友中树立了良好的口碑。那么&#xff0c;老阳口中的选品师项目…

【MySQL】MVCC的实现原理

【MySQL】MVCC的实现原理 MVCC简介事务的隔离级别读未提交&#xff08;Read Uncommitted&#xff09;概念分析 读已提交&#xff08;Read Committed&#xff09;概念分析结论 可重复读&#xff08;Repeatable Read&#xff09;概念分析结论 串行化&#xff08;Serializable &am…

实战—登录功能引发的逻辑漏洞

密码找回功能可能存在的漏洞 1.验证码发送后前端返回 2.验证码无次数限制可爆破 3.验证码可控/邮箱篡改为自己的接收短信验证码/手机号码篡改为自己的接收短信验证码 4.越权漏洞—>自己验证码通过改包然后修改他们密码 5.任意用户密码重置 6.密保问题在前端源码 实战…
最新文章