Java如何创建子线程?
- 后端开发
- 2025-05-29
- 5
方法1:继承Thread类
通过继承Thread类并重写run()方法实现线程逻辑:
class MyThread extends Thread { @Override public void run() { System.out.println("子线程执行任务: " + Thread.currentThread().getName()); } } // 使用线程 public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // 启动线程 } }
特点:
- 直接调用start()方法启动线程。
- 缺点:Java是单继承,若类已继承其他类则无法使用此方法。
方法2:实现Runnable接口
更推荐的方式是实现Runnable接口,避免继承限制:
class MyRunnable implements Runnable { @Override public void run() { System.out.println("子线程执行任务: " + Thread.currentThread().getName()); } } // 使用线程 public class Main { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } }
优势:
- 灵活性高,可与ExecutorService等线程池结合使用。
- 适合多线程资源共享场景。
方法3:使用Callable和Future
需要获取线程返回结果时,可选择Callable接口:
import java.util.concurrent.*; class MyCallable implements Callable<String> { @Override public String call() { return "子线程返回值: " + Thread.currentThread().getName(); } } // 使用线程 public class Main { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(new MyCallable()); System.out.println(future.get()); // 获取返回值 executor.shutdown(); } }
适用场景:
- 需要异步任务返回结果。
- 支持异常抛出,比Runnable更强大。
方法4:线程池(推荐实践)
通过线程池管理线程资源,避免频繁创建和销毁线程的开销:
优点:
- 资源复用,提升性能。
- 提供任务队列、线程数控制等高级功能。
Lambda表达式简化代码(Java 8+)
通过Lambda表达式减少冗余代码:
public class Main { public static void main(String[] args) { // 使用Runnable的Lambda形式 new Thread(() -> { System.out.println("Lambda简化线程创建"); }).start(); } }
注意事项与最佳实践
-
避免直接调用run()方法
调用start()会启动新线程执行任务,而直接调用run()会在当前线程同步执行。
-
线程安全与资源共享
多线程访问共享变量时需使用synchronized或Lock避免竞态条件。
-
异常处理
子线程的异常需在run()方法内部捕获,否则会导致线程终止且不提示错误。
-
避免使用stop()方法
强制终止线程可能导致资源未释放,推荐通过逻辑控制线程结束。
-
合理选择线程池类型
- newCachedThreadPool:适合短时异步任务。
- newFixedThreadPool:控制并发数,防止资源耗尽。
- Oracle官方文档:Java Threads
- 《Java并发编程实战》(Brian Goetz等)
- Java标准库源码分析:java.util.concurrent包
引用说明
通过上述方法,开发者可以根据需求灵活选择多线程实现方式,并结合线程池等工具提升程序性能与稳定性。