总结一下JAVA 从低版本到JDK21所有实现多线程的方式及各自的特点
ava 自从创立以来,一直以多线程编程为一个重要特性。下面是从低版本到 JDK 21 的 Java 多线程编程方式以及它们的主要特点:
-
Thread 类(JDK 1.0):
- 使用
java.lang.Thread
类创建线程。 - 每个线程都是一个独立的对象。
- 直接操作线程,但相对较低级。
- 通过继承
Thread
类并覆盖run()
方法来定义线程行为。
- 使用
-
Runnable 接口(JDK 1.0):
- 使用
java.lang.Runnable
接口来实现多线程。 - 较
Thread
类更灵活,因为一个类可以同时实现多个接口。 - 实现
run()
方法,将对象传递给Thread
构造函数,并启动线程。
- 使用
-
Synchronized 关键字(JDK 1.0):
- 使用
synchronized
关键字来保护共享资源,避免竞争条件。 - 简单,但可能导致死锁和性能问题。
- 使用
-
Wait 和 Notify(JDK 1.0):
- 使用
wait()
和notify()
方法来实现线程之间的协作。 - 允许线程等待通知,以避免忙等待。
- 使用
-
Concurrent 包(JDK 1.5):
- 引入了
java.util.concurrent
包,提供更高级别的线程控制。 - 包括
Executor
框架、BlockingQueue
、CountDownLatch
、CyclicBarrier
等工具类。 - 改进了性能和线程管理。
- 引入了
-
Fork/Join 框架(JDK 7):
- 用于处理递归分治任务的并行计算。
- 通过
ForkJoinPool
和RecursiveTask
和RecursiveAction
类实现。 - 适用于处理大规模的数据并行任务。
-
Parallel Streams(JDK 8):
- 引入了并行流,允许集合上的操作并行执行。
- 简化了并行计算,使得在多核系统上更容易执行并行操作。
-
CompletableFuture(JDK 8):
- 用于处理异步编程和组合多个异步操作的工具类。
- 支持创建复杂的异步流程。
-
Reactive 编程(JDK 9+):
- 引入了
Flow
类,支持响应式编程。 - 允许异步事件流的处理和组合。
- 引入了
-
Project Loom(JDK 17+):
- 项目 Loom 旨在简化 Java 中的并发编程。
- 引入了 Fibers(轻量级线程),允许在大量线程之间高效切换。
- 提供了
java.util.concurrent.Executor
的改进版本,以支持 Fibers。
- Virtual Threads(JDK 21+):
- 项目 Loom 的一部分,引入了虚拟线程(Virtual Threads)。
- 虚拟线程是一种轻量级、低开销的线程,可以在 Java 平台上创建数百万个线程。
- 极大地改进了 Java 的并发性能和资源使用。
随着 Java 版本的不断更新,多线程编程的方式和性能不断改进,使 Java 在处理并发任务和多核系统上更加强大和灵活。
下面我写点简单的示例(JDK 版本是 17 或更高):
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class VirtualThreadExample { public static void main(String[] args) { // 创建一个虚拟线程池 ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor(); // 启动虚拟线程执行任务 Future<String> future = executor.submit(() -> { String threadName = Thread.currentThread().getName(); return "Hello from " + threadName; }); try { // 等待任务完成并获取结果 String result = future.get(); System.out.println(result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { // 关闭虚拟线程池 executor.shutdown(); } } }