在 Java 中,创建多线程的方法有 5种:
1️⃣ 实现 Runnable 接口
2️⃣ 继承 Thread 类
3️⃣ 结合 Callable 和 FutureTask
4️⃣ 使用线程池(ExecutorService)
5️⃣ 借助 CompletableFuture

这些方法各有优缺点,根据场景选择合适的方法才是王道!🧠

🧠 知识内容
1️⃣ 实现 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(); // 🏁 启动线程
}
}

2️⃣ 继承 Thread 类 🧵
如果你的任务需要和线程紧密结合,那就继承 Thread 吧。这个方法比较直观,逻辑一目了然!👀

🛠️ 核心特点:

简单直接:继承类后直接写任务逻辑。
限制多继承: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(); // 🏁 启动线程
}
}

3️⃣ 使用 Callable 和 FutureTask 📦✨
当你的任务有 返回值 或可能 抛异常,用 Callable 更专业!再配上 FutureTask,完美解决获取结果的需求!🌟

🛠️ 核心特点:

支持返回值:用 call() 方法返回任务结果。
更灵活:可以抛出检查异常,处理复杂场景。
📋 示例代码:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyCallable implements Callable {
@Override
public Integer call() {
System.out.println(“📦 任务运行中:” + Thread.currentThread().getName());
return 100; // 🎯 返回结果
}
}

public class Main {
public static void main(String[] args) throws Exception {
FutureTask task = new FutureTask<>(new MyCallable());
Thread thread = new Thread(task);
thread.start();
System.out.println(“🔍 任务结果:” + task.get());
}
}

4️⃣ 使用线程池(ExecutorService) ⚡
想同时管理大量任务?线程池是你的最佳帮手!让线程池帮你统筹,专心写任务逻辑就行了!💪

🛠️ 核心特点:

高效管理:减少线程频繁创建和销毁的开销。
资源复用:通过线程池复用线程,性能杠杠的!
📋 示例代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(“⚡ 任务运行中:” + Thread.currentThread().getName());
}
}

public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(new MyRunnable());
executor.shutdown(); // 🛑 关闭线程池
}
}

5️⃣ 使用 CompletableFuture 🌟✨
这可是 Java 8 的黑科技!CompletableFuture 天生异步,还能轻松处理任务依赖链,优雅到没朋友!💃

🛠️ 核心特点:

链式调用:支持多个任务串联执行。
异步编程:写复杂任务的利器。
📋 示例代码:

import java.util.concurrent.CompletableFuture;

public class Main {
public static void main(String[] args) {
CompletableFuture future = CompletableFuture.runAsync(() -> {
System.out.println(“🌟 异步任务运行中:” + Thread.currentThread().getName());
});

    future.thenRun(() -> System.out.println("✅ 后续任务完成!"));
}

}

🌟 扩展知识
1️⃣ Runnable vs Callable 🤔
特性 Runnable Callable
返回值 ❌ 无 ✅ 支持返回值
异常处理 ❌ 不支持抛出检查异常 ✅ 支持抛出检查异常
适用场景 简单任务,不需要返回结果 复杂任务,需返回结果或抛异常
2️⃣ 为什么选择线程池? 🛡️
资源复用:线程池能重复使用线程,避免频繁创建和销毁。
高效管理:线程池根据任务数动态分配线程。
常用线程池:
FixedThreadPool:固定数量的线程池,适合任务数量固定的场景。
CachedThreadPool:弹性线程池,适合任务短暂但数量多的场景。
ScheduledThreadPool:支持定时任务的线程池。
3️⃣ Java 21 的虚拟线程 🚀
虚拟线程来了!这是一种 超轻量级 的线程实现,用它处理高并发就像开挂一样!

📋 示例代码:

Thread.startVirtualThread(() -> System.out.println(“🚀 虚拟线程启动!”));

🌟 适用场景:超高并发场景,性能需求高的系统。

🏁 总结
Runnable 和 Thread:简单直接,适合基础任务。
Callable 和 FutureTask:需要返回值和异常处理时用它。
线程池:高效管理线程,适合复杂并发任务。
CompletableFuture:处理异步任务的不二之选。
虚拟线程:高并发的新宠,轻松驾驭大规模任务。
选择最适合你的工具,用 Java 的多线程能力武装你的代码吧!💪🎉