
Java创建线程有4种方式:1.继承Thread类;2.实现Runnable接口;3.实现Callable接口配合Future获取结果;4.使用Executor框架的线程池。前两种适合基础场景,后两种更适用于工程实践,选择取决于是否需返回值、线程复用及资源管控需求。
Java 创建线程主要有 4 种方式,本质都是基于 Thread 类或其执行机制,但封装层级和使用场景不同。掌握它们的区别,能帮你写出更清晰、可维护、符合规范的多线程代码。
最直观的方式:自定义类继承 Thread,重写 run() 方法,然后调用 start() 启动。
Thread,就无法再继承其他类start(),不是 run();直接调用 run() 只是普通方法执行,不会开启新线程更推荐的方式:定义类实现 Runnable 接口,重写 run(),再将其实例传给 Thread 构造器。
ExecutorService.submit(Runnable))new Thread(new MyTask()).start();
适用于需要**返回结果**或**抛出异常**的任务。它比 Runnable 更强大,但需配合 Future 获取结果。
Calla
ble.call() 返回泛型结果,且可抛出受检异常Thread,而是提交给线程池:ExecutorService.submit(Callable),返回 Future
future.get() 阻塞获取结果,或用 isDone()/cancel() 控制生命周期生产环境的主流方式:通过 Executors 工具类或 ThreadPoolExecutor 创建线程池,统一管理线程生命周期。
newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool
Runnable 和 Callable,返回 Future 或无返回值ThreadPoolExecutor 显式构造,避免 Executors 的潜在风险(如无界队列导致 OOM)基本上就这些。前两种偏基础,后两种更贴近工程实践。选择哪种,关键看是否需要返回值、是否要复用线程、以及项目对资源管控的要求。