java中怎么实现多线程

java中怎么实现多线程
最新回答
著墨染雨君画夕

2026-01-20 09:14:14

在Java中实现多线程主要有以下几种方式,每种方式适用于不同场景,以下是详细说明和代码示例:

1. 继承 Thread 类

通过继承 Thread 类并重写 run() 方法实现多线程。特点:简单直接,但Java不支持多继承,灵活性较差。

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(); // 启动线程 }}2. 实现 Runnable 接口

通过实现 Runnable 接口(函数式接口),将任务逻辑放在 run() 方法中,并传递给 Thread 对象。特点:更灵活,避免单继承限制,推荐使用。

public class Main { public static void main(String[] args) { Runnable task = () -> { System.out.println("线程执行任务: " + Thread.currentThread().getName()); }; Thread thread = new Thread(task); thread.start(); }}3. 实现 Callable 接口 + FutureTask

Callable 接口允许线程返回结果或抛出异常,通过 FutureTask 包装后提交给 Thread。特点:适合需要获取线程执行结果的场景。

import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;public class Main { public static void main(String[] args) throws Exception { Callable<String> task = () -> { return "线程返回结果"; }; FutureTask<String> futureTask = new FutureTask<>(task); Thread thread = new Thread(futureTask); thread.start(); System.out.println(futureTask.get()); // 获取结果 }}4. 使用线程池(ExecutorService)

通过 Executors 工厂类创建线程池,提交任务执行。特点:高效管理线程生命周期,避免频繁创建/销毁线程的开销。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Main { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); // 创建固定大小线程池 Runnable task = () -> { System.out.println("线程池执行任务: " + Thread.currentThread().getName()); }; executor.submit(task); // 提交任务 executor.shutdown(); // 关闭线程池 }}线程通信机制

多线程间可通过以下方式同步或通信:

  • 共享变量:多个线程访问同一变量(需同步控制)。
  • 锁(synchronized/ReentrantLock):防止数据竞争。synchronized (lockObject) { // 临界区代码}
  • 条件变量(wait()/notify()):线程间等待/通知机制。
  • 管道(PipedInputStream/PipedOutputStream):通过流传递数据。
线程生命周期
  1. 新生(New):线程对象创建但未启动。
  2. 可运行(Runnable):调用 start() 后进入就绪状态,等待CPU调度。
  3. 运行(Running):线程获得CPU时间片执行任务。
  4. 阻塞(Blocked):因等待锁、I/O等暂停执行。
  5. 死亡(Dead):run() 执行完毕或异常终止。
总结
  • 简单任务:用 Runnable 或 Thread 类。
  • 需要返回值:用 Callable + FutureTask。
  • 高性能场景:优先使用线程池(如 Executors)。
  • 同步控制:根据场景选择 synchronized 或 Lock。

通过合理选择实现方式,可以高效利用多核CPU资源,同时避免线程安全问题。