总结一下JAVA 从低版本到JDK21所有实现多线程的方式及各自的特点

ava 自从创立以来,一直以多线程编程为一个重要特性。下面是从低版本到 JDK 21 的 Java 多线程编程方式以及它们的主要特点:

  1. Thread 类(JDK 1.0)

    • 使用 java.lang.Thread 类创建线程。
    • 每个线程都是一个独立的对象。
    • 直接操作线程,但相对较低级。
    • 通过继承 Thread 类并覆盖 run() 方法来定义线程行为。
  2. Runnable 接口(JDK 1.0)

    • 使用 java.lang.Runnable 接口来实现多线程。
    • Thread 类更灵活,因为一个类可以同时实现多个接口。
    • 实现 run() 方法,将对象传递给 Thread 构造函数,并启动线程。
  3. Synchronized 关键字(JDK 1.0)

    • 使用 synchronized 关键字来保护共享资源,避免竞争条件。
    • 简单,但可能导致死锁和性能问题。
  4. Wait 和 Notify(JDK 1.0)

    • 使用 wait()notify() 方法来实现线程之间的协作。
    • 允许线程等待通知,以避免忙等待。
  5. Concurrent 包(JDK 1.5)

    • 引入了 java.util.concurrent 包,提供更高级别的线程控制。
    • 包括 Executor 框架、BlockingQueueCountDownLatchCyclicBarrier 等工具类。
    • 改进了性能和线程管理。
  6. Fork/Join 框架(JDK 7)

    • 用于处理递归分治任务的并行计算。
    • 通过 ForkJoinPoolRecursiveTaskRecursiveAction 类实现。
    • 适用于处理大规模的数据并行任务。
  7. Parallel Streams(JDK 8)

    • 引入了并行流,允许集合上的操作并行执行。
    • 简化了并行计算,使得在多核系统上更容易执行并行操作。
  8. CompletableFuture(JDK 8)

    • 用于处理异步编程和组合多个异步操作的工具类。
    • 支持创建复杂的异步流程。
  9. Reactive 编程(JDK 9+)

    • 引入了 Flow 类,支持响应式编程。
    • 允许异步事件流的处理和组合。
  10. Project Loom(JDK 17+)

  • 项目 Loom 旨在简化 Java 中的并发编程。
  • 引入了 Fibers(轻量级线程),允许在大量线程之间高效切换。
  • 提供了 java.util.concurrent.Executor 的改进版本,以支持 Fibers。
  1. 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();
        }
    }
}

 

posted @ 2023-10-15 11:48  锐洋智能  阅读(227)  评论(0编辑  收藏  举报