创建线程的几种方法
在 Java 中创建和执行线程主要有以下四种方式。根据不同的业务场景我们需要权衡其灵活性、返回值需求以及资源开销。1. 继承Thread类这是最直观的线程创建方式。通过继承java.lang.Thread类并重写run()方法来定义线程的执行逻辑。示例代码public class MyThread extends Thread { Override public void run() { System.out.println(继承 Thread 类创建的线程: Thread.currentThread().getName()); } public static void main(String[] args) { MyThread thread new MyThread(); // 启动线程注意必须调用 start()调用 run() 只是普通方法调用不会启动新线程 thread.start(); } }特点分析优点编写简单在run()方法中直接使用this即可获取当前线程。缺点Java 仅支持单继承。如果当前类已经继承了其他父类如BaseEntity就无法再使用这种方式。2. 实现Runnable接口为了解决单继承的限制推荐使用实现java.lang.Runnable接口的方式。该方式实现了“任务逻辑Runnable”与“线程媒介Thread”的解耦。示例代码public class MyRunnable implements Runnable { Override public void run() { System.out.println(实现 Runnable 接口创建的线程: Thread.currentThread().getName()); } public static void main(String[] args) { // 创建任务实例 MyRunnable runnable new MyRunnable(); // 将任务传递给 Thread 对象并启动 new Thread(runnable, Runnable-Thread).start(); // 简写使用 Lambda 表达式JDK 8 推荐 new Thread(() - System.out.println(Lambda 线程: Thread.currentThread().getName())).start(); } }特点分析优点规避了单继承的局限性。适合多个相同程序代码的线程去处理同一个资源把虚拟的 CPU线程与数据、代码任务分离开更好地体现了面向对象的思想。缺点run()方法没有返回值且无法向外抛出受检异常Checked Exception。3. 实现Callable接口 FutureTask如果任务执行完毕后需要获取返回结果或者需要抛出异常可以使用java.util.concurrent.Callable接口。它需要配合FutureTask来使用。示例代码import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class MyCallable implements CallableInteger { Override public Integer call() throws Exception { System.out.println(Callable 开始计算...); Thread.sleep(1000); // 模拟耗时操作 return 42; // 支持返回值 } public static void main(String[] args) { // 1. 创建 Callable 任务 MyCallable callable new MyCallable(); // 2. 使用 FutureTask 包装 CallableFutureTask 实现了 RunnableFuture它既是 Runnable又是 Future FutureTaskInteger futureTask new FutureTask(callable); // 3. 放入 Thread 中执行 new Thread(futureTask).start(); try { // 4. 获取返回结果。注意get() 方法是阻塞性的会等待线程执行完毕才返回 Integer result futureTask.get(); System.out.println(线程执行结果为: result); } catch (Exception e) { e.printStackTrace(); } } }特点分析优点支持获取线程执行的返回值。允许call()方法声明抛出异常便于在外层捕获处理。支持取消任务。缺点实现步骤相对繁琐在调用get()方法时如果任务未完成会导致主线程阻塞。4. 使用线程池 (ExecutorService)在企业级实际开发中绝对不允许在代码中显式地new Thread()来创建线程。因为频繁地创建和销毁线程会消耗大量系统资源。我们必须通过线程池来管理和复用线程。示例代码import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolDemo { public static void main(String[] args) { // 推荐通过 ThreadPoolExecutor 手动创建线程池避免使用 Executors 快捷方法导致 OOM ExecutorService threadPool new ThreadPoolExecutor( 2, // 核心线程数 5, // 最大线程数 60, TimeUnit.SECONDS, // 线程空闲存活时间 new LinkedBlockingQueue(100), // 任务队列 new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略 ); // 提交无返回值的 Runnable 任务 threadPool.execute(() - { System.out.println(线程池执行无返回值任务: Thread.currentThread().getName()); }); // 提交有返回值的 Callable 任务并获取 Future var future threadPool.submit(() - { System.out.println(线程池执行有返回值任务...); return Success; }); try { System.out.println(返回结果: future.get()); } catch (Exception e) { e.printStackTrace(); } // 优雅关闭线程池 threadPool.shutdown(); } }特点分析优点降低资源消耗重复利用已创建的线程减少创建和销毁的开销。提高响应速度任务到达时无需等待线程创建即可立即执行。提高线程的可管理性防止无限制创建线程导致系统崩溃OOM可以进行统一的分配、调优和监控。缺点参数配置复杂需要根据具体的业务CPU 密集型或 IO 密集型合理配置核心参数。核心对比与选型指南维度继承 Thread实现 Runnable实现 Callable线程池 (Recommended)单继承限制有限制无法继承其他类无限制无限制无限制是否有返回值否否是视提交的方法而定 (submit/execute)是否能抛出异常否只能内部捕获否只能内部捕获是视具体执行任务而定资源消耗极高每次需 new极高每次需 new极高每次需 new极低线程复用适用场景极其简单的测试 Demo简单的、无返回值的多线程任务需要获取异步执行结果的单次任务所有的生产环境及实际业务项目终极面试考点 避坑指南start()与run()的区别调用start()方法会使线程进入就绪状态Runnable等待 CPU 调度后真正启动新线程执行run()。直接调用run()只是普通的同步方法调用依然在当前主线程中运行无法达到并发效果。为什么不允许使用Executors创建线程池阿里 Java 开发手册中明确指出Executors.newCachedThreadPool()和newScheduledThreadPool()允许创建的线程数量为Integer.MAX_VALUE可能会创建大量线程导致 OOM内存溢出。Executors.newFixedThreadPool()允许的队列长度为Integer.MAX_VALUE可能会堆积大量请求导致 OOM。因此必须通过ThreadPoolExecutor手动显式创建明确核心参数。

相关新闻

Spring Statemachine(状态机)

Spring Statemachine(状态机)

什么是状态机 状态机是状态模式的一种应用,相当于上下文角色的一个升级版。在工作流 或游戏等各种系统中有大量使用,如各种工作流引擎,它几乎是状态机的子集和实现,封装状态的变化规则。状态机可以帮助开发者简化状态控制的开发过…

2026/6/28 1:58:12阅读更多 →
AI核心概念扫盲:从大模型到Agent的一站式入门指南

AI核心概念扫盲:从大模型到Agent的一站式入门指南

AI核心概念扫盲:从大模型到Agent的一站式入门指南 掌握这条链路,让你彻底搞懂AI热词不再发懵。 学AI工具时,最让人头疼的往往不是“不会用”,而是扑面而来的各种名词:大语言模型、Token、上下文、Prompt、工具调用、MC…

2026/6/28 1:58:12阅读更多 →
用参考图引导的扩散模型提升重选封面帧画质

用参考图引导的扩散模型提升重选封面帧画质

背景在手机摄影中,Live Photo 早已成为一种常见而成熟的拍摄形式,它不再只是定格一个画面,而是记录“此时此刻”的状态与情绪,捕捉那些转瞬即逝的精彩瞬间。它由一张高清封面图和一段短视频共同组成,既保留了照片的清晰…

2026/6/28 1:58:12阅读更多 →
预编译知识

预编译知识

只有定义了AAA下面这句话才会编译

2026/6/28 5:18:22阅读更多 →
长需求文档拆解别只靠人工:一次评审前的验证流程

长需求文档拆解别只靠人工:一次评审前的验证流程

文章摘要:后端开发中常遇到需求文档冗长且不明确的情况,使用AI工具如ClaudeOpus4.8进行需求分析可显著提升效率。文章分享了如何利用AI拆解长文档:先整理材料为结构化格式,让AI提取核心流程、接口字段和异常分支;再生成…

2026/6/28 5:18:22阅读更多 →
无人直播流量分层孵化提升成交转化率

无人直播流量分层孵化提升成交转化率

你有没有遇到过这种场景?花了几千块买设备,从早播到晚,直播间却只有个位数的在线,偶尔进几个人,看一眼就走了。别急着怀疑是产品不行或话术不对,问题很可能出在一个被你忽略的思路——流量分层孵化。先别急…

2026/6/28 5:18:22阅读更多 →
海王IM即时通讯----沟通工具的增多,并未带来协作效率的同步提升

海王IM即时通讯----沟通工具的增多,并未带来协作效率的同步提升

企业数字化程度越高,沟通工具反而越多。微信建客户群,钉钉传文件,邮件发正式通知,腾讯会议开远程讨论,再搭配一个项目管理工具同步进度。工具之间的切换本身已成为一种日常消耗。 这种多工具并存的现状,使沟…

2026/6/28 5:18:22阅读更多 →
【LangChain】 预定义工具与 Toolkits 详解:从单独使用到混合编排

【LangChain】 预定义工具与 Toolkits 详解:从单独使用到混合编排

LangChain 预定义工具与 Toolkits 详解:从单独使用到混合编排 一、引言 在上一篇博客中,我们深入探讨了 LangChain 中自定义工具(Custom Tools)的实现方式,包括如何使用 tool 装饰器和 BaseTool 类来封装业务逻辑。然而…

2026/6/28 5:18:22阅读更多 →
G7易流发布货运穿戴式AI硬件‘拍拍豆’,补齐物流车下场景数字化拼图!

G7易流发布货运穿戴式AI硬件‘拍拍豆’,补齐物流车下场景数字化拼图!

6月25日,G7易流发布货运行业首款穿戴式AI硬件“拍拍豆”。它能解决车下场景数字化难题,推动物流管理从“人管人”迈向“数据管人”。物流AI市场增长迅猛物流行业AI化进程加速,据统计2025年全球物流与供应链管理AI市场规模超340亿美元&#xf…

2026/6/28 5:13:22阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →