方法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:线程池(推荐实践)
通过线程池管理线程资源,避免频繁创建和销毁线程的开销:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { // 创建固定大小的线程池 ExecutorService executor = Executors.newFixedThreadPool(3); // 提交任务 executor.execute(() -> { System.out.println("线程池执行任务: " + Thread.currentThread().getName()); }); executor.shutdown(); // 关闭线程池 } }
优点:
- 资源复用,提升性能。
- 提供任务队列、线程数控制等高级功能。
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
包
通过上述方法,开发者可以根据需求灵活选择多线程实现方式,并结合线程池等工具提升程序性能与稳定性。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/6309.html