当前位置: 首页 > news >正文

Java高频面试之并发编程-03

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:线程的创建方式有哪些?

Java 中线程的创建主要有以下三种核心方式,每种方式各有适用场景和优缺点:


一、继承 Thread 类

实现方式

  1. 自定义类继承 Thread 类,重写 run() 方法。
  2. 创建子类实例并调用 start() 方法启动线程。

代码示例

class MyThread extends Thread {@Overridepublic void run() {System.out.println("使用 Thread 类创建线程");}
}public static void main(String[] args) {MyThread thread = new MyThread();thread.start();
}

特点

  • 优点:简单直接。
  • 缺点:Java 单继承机制限制,若类已继承其他类则无法使用此方式。

二、实现 Runnable 接口

实现方式

  1. 自定义类实现 Runnable 接口,重写 run() 方法。
  2. 将实现类实例作为参数传递给 Thread 对象,调用 start() 方法启动线程。

代码示例

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("使用 Runnable 接口创建线程");}
}public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();
}

特点

  • 优点:避免单继承限制,适合资源共享(如多线程操作同一对象)。
  • 缺点:无法直接返回执行结果。

三、实现 Callable 接口

实现方式

  1. 自定义类实现 Callable<T> 接口,重写 call() 方法(可返回结果)。
  2. Callable 实例包装为 FutureTask 对象。
  3. FutureTask 对象传递给 Thread 对象并启动线程。

代码示例

class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "Callable 线程返回结果";}
}public static void main(String[] args) throws Exception {FutureTask<String> futureTask = new FutureTask<>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();System.out.println(futureTask.get()); // 获取返回结果
}

特点

  • 优点:支持返回值,可抛出异常,灵活性高。
  • 缺点:需通过 FutureTask 获取结果,代码稍复杂。

四、高级应用:线程池(Executor 框架)

虽然严格来说线程池属于线程管理工具,但实际开发中常用其创建线程:

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> System.out.println("线程池创建线程"));
executor.shutdown();

优势:统一管理线程生命周期,避免频繁创建/销毁线程的开销。


对比总结

方式优点缺点适用场景
继承 Thread简单直接单继承限制简单任务或快速验证
实现 Runnable避免继承限制,资源共享无返回值多线程协同处理共享数据
实现 Callable支持返回值,异常处理需配合 FutureTask 使用需要结果反馈的异步任务
线程池资源复用,高效管理需学习线程池配置高并发或长期运行的任务

建议:优先选择 RunnableCallable(面向接口编程),结合线程池提升性能。

在这里插入图片描述


文章转载自:

http://ayl4oBFZ.xpqyf.cn
http://MYlKJBzS.xpqyf.cn
http://PZPpAyrI.xpqyf.cn
http://n9UGfYdY.xpqyf.cn
http://qWTDYjVY.xpqyf.cn
http://1jtOyui0.xpqyf.cn
http://gSvDtPgD.xpqyf.cn
http://Z1n8A5R5.xpqyf.cn
http://1n6Umzvl.xpqyf.cn
http://FFSkim3k.xpqyf.cn
http://75KOEb8k.xpqyf.cn
http://cLcxVX5P.xpqyf.cn
http://fj5ZWv1n.xpqyf.cn
http://O8y6gWpk.xpqyf.cn
http://i2zwdL4r.xpqyf.cn
http://GrhlpggI.xpqyf.cn
http://r37yucID.xpqyf.cn
http://XVmaoZ5C.xpqyf.cn
http://Sv58buZn.xpqyf.cn
http://l0D4fFQS.xpqyf.cn
http://qbZ3HtIm.xpqyf.cn
http://OBh5agqM.xpqyf.cn
http://N71cZit2.xpqyf.cn
http://x5zjcWIK.xpqyf.cn
http://5S54hpGp.xpqyf.cn
http://LbsWheH0.xpqyf.cn
http://GYl5MgCH.xpqyf.cn
http://NBTR48Db.xpqyf.cn
http://fH3KhDLo.xpqyf.cn
http://FG9I41LI.xpqyf.cn
http://www.dtcms.com/a/136629.html

相关文章:

  • Qt QML实现Windows桌面颜色提取器
  • JVM:类加载子系统
  • android rtsp 拉流h264 h265,解码nv12转码nv21耗时卡顿问题及ffmpeg优化
  • 基于多模态深度学习的亚急性脊髓联合变性全流程预测与个性化管理技术方案
  • JVM:对象的实例化、直接内存
  • cfd笔记【1】简介
  • vue js 上传文件 form data
  • 一个含有 n 个顶点的连通且无环的简单无向图,在其邻接矩阵存储结构中共有几个零元素?
  • Hadoop集群部署教程-END
  • 【25软考网工笔记】第二章 数据通信基础(4)数据编码
  • Flask快速入门
  • Flask(1): 在windows系统上部署项目1
  • android11通过白名单卸载安装应用
  • NET 注入日志Logger错误
  • Rust : 关于*const () 与type erase
  • 算法-同余原理
  • 《MySQL下载安装:Linux下载MySQL 5.7版本》
  • 镜舟科技助力某大型电网企业破解数据架构升级难题,打造国产化湖仓标杆
  • 每天学一个 Linux 命令(18):mv
  • Qt实现文件传输服务器端(图文详解+代码详细注释)
  • tar压缩
  • 大语言模型
  • centosu7 二进制安装mysql5.7
  • Linux——消息队列
  • Spring Boot集成MinIO的详细步骤
  • 避坑,app 播放器media:MediaElement paly报错
  • 子函数嵌套的意义——以“颜色排序”为例(Python)
  • css 中float属性及clear的释疑
  • 小白如何从0学习CSS
  • Spark-SQL与Hive的连接及数据处理全解析