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

Java 创建线程的方式笔记

一、Java 中创建线程的四种主要方式

方式简述适用场景
继承 Thread 类重写 run() 方法,直接创建线程简单场景、临时任务
实现 Runnable 接口将任务与线程分离推荐方式,任务更灵活
实现 Callable 接口支持返回值和异常异步任务,需要结果的场景
使用线程池(Executor)统一管理线程、复用资源高并发任务、后台服务等

二、方式一:继承 Thread

2.1 示例代码

public class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread by extending Thread class");}public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动线程}
}

2.2 特点

  • 简单直观,适合快速实验。
  • 不能再继承其他类(因为 Java 单继承)。

三、方式二:实现 Runnable 接口

3.1 示例代码

public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread by implementing Runnable");}public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
}

3.2 Lambda 简写(Java 8+)

Thread thread = new Thread(() -> System.out.println("Runnable with Lambda"));
thread.start();

3.3 特点

  • 更推荐的方式:任务与线程解耦,利于代码复用。
  • 可避免继承限制(类可同时实现多个接口)。

四、方式三:实现 Callable 接口 + FutureTask

4.1 示例代码

import java.util.concurrent.*;public class MyCallable implements Callable<String> {@Overridepublic String call() {return "Result from Callable";}public static void main(String[] args) throws Exception {Callable<String> callable = new MyCallable();FutureTask<String> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();String result = futureTask.get(); // 阻塞直到任务完成System.out.println(result);}
}

4.2 特点

  • 支持返回值(Future.get() 获取结果)。
  • 支持异常抛出。
  • 常用于需要任务结果的异步处理。

五、方式四:使用线程池(推荐)

5.1 创建线程池的方式

ExecutorService executor = Executors.newFixedThreadPool(5);executor.submit(() -> {System.out.println("Task in thread pool");
});
executor.shutdown();

5.2 使用 Callable + Future 获取结果

Callable<String> task = () -> "Hello from Callable";
Future<String> future = executor.submit(task);
System.out.println(future.get());

5.3 推荐使用 ThreadPoolExecutor 构造方法

ExecutorService pool = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(100),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy()
);

5.4 特点

  • 更强的任务调度与资源控制能力。
  • 支持线程复用,减少资源消耗。
  • 支持拒绝策略、线程工厂、任务统计等。

六、方式五(拓展):使用定时任务线程池 ScheduledExecutorService

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.scheduleAtFixedRate(() -> {System.out.println("Running scheduled task...");
}, 0, 5, TimeUnit.SECONDS);

七、各方式对比总结

方式是否支持返回值是否支持异常处理推荐度特点简述
继承 Thread★★☆☆☆简单但耦合度高
实现 Runnable★★★★☆灵活,任务与线程分离
实现 Callable★★★★★支持异步、有返回值
Executor 线程池★★★★★资源可控,适用于生产级应用
ScheduledExecutor★★★★☆定时/周期性任务

八、最佳实践建议

  1. 永远不要使用 new Thread() 启动线程处理业务逻辑。
  2. 使用线程池统一管理线程生命周期。
  3. 对于需要结果的任务,使用 Callable + Future
  4. 对于定期任务,使用 ScheduledExecutorService
  5. Java 8 以后建议使用 Lambda 简化线程任务代码。
  6. 在线程执行中注意异常捕获、资源释放与日志记录。

九、附:线程池参数详解表

参数名含义
corePoolSize核心线程数
maximumPoolSize最大线程数
keepAliveTime非核心线程空闲多久被回收
workQueue任务队列(如:LinkedBlockingQueue)
threadFactory自定义线程工厂
handler拒绝策略(Abort、CallerRuns等)

十、参考文档与资料

  • Java 官方文档 - java.lang.Thread
  • 《Java 并发编程实战》
  • 阿里巴巴 Java 开发手册(线程池部分)
  • Java 并发教程:https://www.baeldung.com/java-concurrency
http://www.dtcms.com/a/289277.html

相关文章:

  • 【RK3576】【Android14】ADB工具说明与使用
  • 设计模式笔记(1)简单工厂模式
  • 《汇编语言:基于X86处理器》第8章 复习题和练习,编程练习
  • 深度相机的工作模式(以奥比中光深度相机为例)
  • AI开发 | 基于FastAPI+React的流式对话
  • ChatIM项目语音识别安装与使用
  • 论文笔记: Holistic Semantic Representation for Navigational Trajectory Generation
  • 《计算机网络》实验报告四 TCP协议分析
  • 基于FPGA的多级流水线加法器verilog实现,包含testbench测试文件
  • Haproxy算法精简化理解及企业级高功能实战
  • Uniapp 纯前端台球计分器开发指南:能否上架微信小程序 打包成APP?
  • 专题 解空间的一种遍历方式:深度优先(Depth First)
  • 【unitrix】 6.9 减一操作(sub_one.rs)
  • Go语言的函数
  • qcow2磁盘虚拟机的使用
  • Spring Cloud Gateway 电商系统实战指南:架构设计与深度优化
  • Work SSD基础知识
  • 数列-冒泡排序,鸡尾酒排序
  • LINUX(三)文件I/O、对文件打开、读、写、偏移量
  • 什么是 ELK/Grafana
  • Cosmos:构建下一代互联网的“区块链互联网
  • roboflow使用教程
  • GaussDB 数据库架构师修炼(七) 安全规划
  • C51单片机学习笔记——定时器与中断
  • Image Processing 【Normlize和DeNormlize】
  • 【Linux】3. Shell语言
  • Oracle触发器:数据世界的“隐形守护者“
  • EXPLAIN 用法详解(表格)
  • 数据结构-线性表顺序表示
  • 【Linux内核模块】导出符号详解:模块间的“资源共享”机制