第9部分-性能优化、调试与并发设计模式

第9部分:性能优化、调试与并发设计模式

核心目标

构建高质量、可扩展的并发系统。


1. 性能测试与可视化工具

JMH(Java Microbenchmark Harness)

java 复制代码
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Benchmark)
public class ConcurrencyBenchmark {
    private AtomicInteger atomicCounter;
    private int synchronizedCounter;
    private final Object lock = new Object();
    private ReentrantLock reentrantLock;
    private int reentrantLockCounter;
    
    @Setup
    public void setup() {
        atomicCounter = new AtomicInteger(0);
        synchronizedCounter = 0;
        reentrantLock = new ReentrantLock();
        reentrantLockCounter = 0;
    }
    
    @Benchmark
    public int atomicIncrement() {
        return atomicCounter.incrementAndGet();
    }
    
    @Benchmark
    public int synchronizedIncrement() {
        synchronized (lock) {
            return ++synchronizedCounter;
        }
    }
    
    @Benchmark
    public int reentrantLockIncrement() {
        reentrantLock.lock();
        try {
            return ++reentrantLockCounter;
        } finally {
            reentrantLock.unlock();
        }
    }
    
    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
            .include(ConcurrencyBenchmark.class.getSimpleName())
            .forks(1)
            .warmupIterations(5)
            .measurementIterations(10)
            .build();
        
        new Runner(opt).run();
    }
}

VisualVM使用

java 复制代码
public class VisualVMExample {
    public static void main(String[] args) throws InterruptedException {
        // 1. 线程监控
        demonstrateThreadMonitoring();
        
        // 2. 内存监控
        demonstrateMemoryMonitoring();
        
        // 3. CPU监控
        demonstrateCPUMonitoring();
        
        // 4. 死锁检测
        demonstrateDeadlockDetection();
    }
    
    private static void demonstrateThreadMonitoring() throws InterruptedException {
        System.out.println("=== 线程监控 ===");
        
        // 创建多个线程
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final int threadId = i;
            Thread thread = new Thread(() -> {
                try {
                    Thread.sleep(5000);
                    System.out.println("线程 " + threadId + " 完成");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
            threads.add(thread);
            thread.start();
        }
        
        // 等待所有线程完成
        for (Thread thread : threads) {
            thread.join();
        }
    }
    
    private static void demonstrateMemoryMonitoring() {
        System.out.println("=== 内存监控 ===");
        
        // 创建大量对象
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            list.add("String " + i);
        }
        
        // 强制垃圾回收
        System.gc();
        
        // 获取内存信息
        Runtime runtime = Runtime.getRuntime();
        long totalMemory = runtime.totalMemory();
        long freeMemory = runtime.freeMemory();
        long usedMemory = totalMemory - freeMemory;
        
        System.out.println("总内存: " + totalMemory / 1024 / 1024 + "MB");
        System.out.println("已用内存: " + usedMemory / 1024 / 1024 + "MB");
        System.out.println("空闲内存: " + freeMemory / 1024 / 1024 + "MB");
    }
    
    private static void demonstrateCPUMonitoring() {
        System.out.println("=== CPU监控 ===");
        
        // CPU密集型任务
        long start = System.currentTimeMillis();
        long sum = 0;
        for (int i = 0; i < 100000000; i++) {
            sum += i;
        }
        long time = System.currentTimeMillis() - start;
        
        System.out.println("CPU密集型任务耗时: " + time + "ms");
        System.out.println("计算结果: " + sum);
    }
    
    private static void demonstrateDeadlockDetection() throws InterruptedException {
        System.out.println("=== 死锁检测 ===");
        
        Object lock1 = new Object();
        Object lock2 = new Object();
        
        Thread thread1 = new Thread(() -> {
            synchronized (lock1) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                synchronized (lock2) {
                    System.out.println("线程1获取两个锁");
                }
            }
        });
        
        Thread thread2 = new Thread(() -> {
            synchronized (lock2) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                synchronized (lock1) {
                    System.out.println("线程2获取两个锁");
                }
            }
        });
        
        thread1.start();
        thread2.start();
        
        thread1.join();
        thread2.join();
    }
}

Flight Recorder使用

java 复制代码
import jdk.jfr.*;

public class FlightRecorderExample {
    @Event
    public static class CustomEvent {
        @Label("Event Name")
        public String name;
        
        @Label("Event Value")
        public int value;
    }
    
    public static void main(String[] args) throws InterruptedException {
        // 1. 自定义事件
        demonstrateCustomEvents();
        
        // 2. 性能分析
        demonstratePerformanceAnalysis();
        
        // 3. 内存分析
        demonstrateMemoryAnalysis();
    }
    
    private static void demonstrateCustomEvents() throws InterruptedException {
        System.out.println("=== 自定义事件 ===");
        
        for (int i = 0; i < 100; i++) {
            CustomEvent event = new CustomEvent();
            event.name = "CustomEvent";
            event.value = i;
            event.commit();
            
            Thread.sleep(10);
        }
    }
    
    private static void demonstratePerformanceAnalysis() throws InterruptedException {
        System.out.println("=== 性能分析 ===");
        
        // 创建多个线程执行任务
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            final int threadId = i;
            Thread thread = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    // 模拟工作
                    Math.random();
                }
            });
            threads.add(thread);
            thread.start();
        }
        
        for (Thread thread : threads) {
            thread.join();
        }
    }
    
    private static void demonstrateMemoryAnalysis() {
        System.out.println("=== 内存分析 ===");
        
        // 创建大量对象
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            list.add("String " + i);
        }
        
        // 强制垃圾回收
        System.gc();
    }
}

2. 线程池调优与背压控制

线程池参数调优

java 复制代码
public class ThreadPoolTuning {
    public static void main(String[] args) throws InterruptedException {
        // 1. 核心参数调优
        demonstrateCoreParameterTuning();
        
        // 2. 队列选择
        demonstrateQueueSelection();
        
        // 3. 拒绝策略
        demonstrateRejectionPolicies();
        
        // 4. 背压控制
        demonstrateBackpressureControl();
    }
    
    private static void demonstrateCoreParameterTuning() throws InterruptedException {
        System.out.println("=== 核心参数调优 ===");
        
        // CPU密集型任务
        ThreadPoolExecutor cpuIntensivePool = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors(), // 核心线程数
            Runtime.getRuntime().availableProcessors(), // 最大线程数
            60L, TimeUnit.SECONDS, // 空闲时间
            new LinkedBlockingQueue<>(), // 队列
            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
        );
        
        // I/O密集型任务
        ThreadPoolExecutor ioIntensivePool = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors() * 2, // 核心线程数
            Runtime.getRuntime().availableProcessors() * 4, // 最大线程数
            60L, TimeUnit.SECONDS, // 空闲时间
            new LinkedBlockingQueue<>(100), // 有界队列
            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
        );
        
        // 测试CPU密集型任务
        testThreadPool(cpuIntensivePool, "CPU密集型");
        
        // 测试I/O密集型任务
        testThreadPool(ioIntensivePool, "I/O密集型");
        
        cpuIntensivePool.shutdown();
        ioIntensivePool.shutdown();
    }
    
    private static void testThreadPool(ThreadPoolExecutor pool, String type) throws InterruptedException {
        long start = System.currentTimeMillis();
        
        List<Future<String>> futures = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            final int taskId = i;
            Future<String> future = pool.submit(() -> {
                try {
                    Thread.sleep(100);
                    return type + " 任务 " + taskId + " 完成";
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return type + " 任务 " + taskId + " 中断";
                }
            });
            futures.add(future);
        }
        
        for (Future<String> future : futures) {
            future.get();
        }
        
        long time = System.currentTimeMillis() - start;
        System.out.println(type + " 线程池耗时: " + time + "ms");
    }
    
    private static void demonstrateQueueSelection() throws InterruptedException {
        System.out.println("=== 队列选择 ===");
        
        // 1. LinkedBlockingQueue(无界)
        ThreadPoolExecutor unboundedPool = new ThreadPoolExecutor(
            2, 4, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(), // 无界队列
            new ThreadPoolExecutor.AbortPolicy()
        );
        
        // 2. ArrayBlockingQueue(有界)
        ThreadPoolExecutor boundedPool = new ThreadPoolExecutor(
            2, 4, 60L, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(10), // 有界队列
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
        
        // 3. SynchronousQueue(同步队列)
        ThreadPoolExecutor synchronousPool = new ThreadPoolExecutor(
            2, 4, 60L, TimeUnit.SECONDS,
            new SynchronousQueue<>(), // 同步队列
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
        
        // 测试不同队列
        testQueue(unboundedPool, "无界队列");
        testQueue(boundedPool, "有界队列");
        testQueue(synchronousPool, "同步队列");
        
        unboundedPool.shutdown();
        boundedPool.shutdown();
        synchronousPool.shutdown();
    }
    
    private static void testQueue(ThreadPoolExecutor pool, String queueType) throws InterruptedException {
        long start = System.currentTimeMillis();
        
        List<Future<String>> futures = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            final int taskId = i;
            Future<String> future = pool.submit(() -> {
                try {
                    Thread.sleep(100);
                    return queueType + " 任务 " + taskId + " 完成";
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return queueType + " 任务 " + taskId + " 中断";
                }
            });
            futures.add(future);
        }
        
        for (Future<String> future : futures) {
            future.get();
        }
        
        long time = System.currentTimeMillis() - start;
        System.out.println(queueType + " 耗时: " + time + "ms");
    }
    
    private static void demonstrateRejectionPolicies() throws InterruptedException {
        System.out.println("=== 拒绝策略 ===");
        
        // 1. AbortPolicy(抛出异常)
        testRejectionPolicy(new ThreadPoolExecutor.AbortPolicy(), "AbortPolicy");
        
        // 2. CallerRunsPolicy(调用者运行)
        testRejectionPolicy(new ThreadPoolExecutor.CallerRunsPolicy(), "CallerRunsPolicy");
        
        // 3. DiscardPolicy(丢弃任务)
        testRejectionPolicy(new ThreadPoolExecutor.DiscardPolicy(), "DiscardPolicy");
        
        // 4. DiscardOldestPolicy(丢弃最老任务)
        testRejectionPolicy(new ThreadPoolExecutor.DiscardOldestPolicy(), "DiscardOldestPolicy");
    }
    
    private static void testRejectionPolicy(RejectedExecutionHandler handler, String policyName) {
        System.out.println("测试 " + policyName + ":");
        
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
            1, 1, 60L, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(1), // 小队列
            handler
        );
        
        try {
            for (int i = 0; i < 5; i++) {
                final int taskId = i;
                pool.submit(() -> {
                    try {
                        Thread.sleep(1000);
                        System.out.println("任务 " + taskId + " 完成");
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            }
        } catch (RejectedExecutionException e) {
            System.out.println("任务被拒绝: " + e.getMessage());
        }
        
        pool.shutdown();
    }
    
    private static void demonstrateBackpressureControl() throws InterruptedException {
        System.out.println("=== 背压控制 ===");
        
        // 使用信号量控制并发
        Semaphore semaphore = new Semaphore(5); // 最多5个并发任务
        
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
            10, 10, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(),
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
        
        List<Future<String>> futures = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            final int taskId = i;
            Future<String> future = pool.submit(() -> {
                try {
                    semaphore.acquire(); // 获取许可
                    try {
                        Thread.sleep(1000);
                        return "任务 " + taskId + " 完成";
                    } finally {
                        semaphore.release(); // 释放许可
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return "任务 " + taskId + " 中断";
                }
            });
            futures.add(future);
        }
        
        for (Future<String> future : futures) {
            System.out.println(future.get());
        }
        
        pool.shutdown();
    }
}

自适应线程池

java 复制代码
public class AdaptiveThreadPool {
    private final ThreadPoolExecutor pool;
    private final AtomicInteger taskCount = new AtomicInteger(0);
    private final AtomicLong totalExecutionTime = new AtomicLong(0);
    private final AtomicLong lastAdjustmentTime = new AtomicLong(System.currentTimeMillis());
    
    public AdaptiveThreadPool() {
        this.pool = new ThreadPoolExecutor(
            2, 10, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(),
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
        
        // 启动自适应调整线程
        startAdaptiveAdjustment();
    }
    
    private void startAdaptiveAdjustment() {
        Thread adjustmentThread = new Thread(() -> {
            while (!pool.isShutdown()) {
                try {
                    Thread.sleep(5000); // 每5秒调整一次
                    adjustPoolSize();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        });
        adjustmentThread.setDaemon(true);
        adjustmentThread.start();
    }
    
    private void adjustPoolSize() {
        int currentSize = pool.getPoolSize();
        int activeCount = pool.getActiveCount();
        int queueSize = pool.getQueue().size();
        
        // 计算平均执行时间
        long currentTime = System.currentTimeMillis();
        long timeSinceLastAdjustment = currentTime - lastAdjustmentTime.get();
        int tasksSinceLastAdjustment = taskCount.get();
        
        if (tasksSinceLastAdjustment > 0) {
            long avgExecutionTime = timeSinceLastAdjustment / tasksSinceLastAdjustment;
            
            // 根据队列大小和平均执行时间调整线程数
            if (queueSize > 10 && avgExecutionTime > 1000) {
                // 增加线程数
                int newSize = Math.min(currentSize + 2, pool.getMaximumPoolSize());
                pool.setCorePoolSize(newSize);
                System.out.println("增加线程数到: " + newSize);
            } else if (queueSize < 2 && avgExecutionTime < 500) {
                // 减少线程数
                int newSize = Math.max(currentSize - 1, 1);
                pool.setCorePoolSize(newSize);
                System.out.println("减少线程数到: " + newSize);
            }
        }
        
        // 重置计数器
        taskCount.set(0);
        lastAdjustmentTime.set(currentTime);
    }
    
    public Future<String> submit(Callable<String> task) {
        taskCount.incrementAndGet();
        return pool.submit(task);
    }
    
    public void shutdown() {
        pool.shutdown();
    }
    
    public static void main(String[] args) throws InterruptedException {
        AdaptiveThreadPool adaptivePool = new AdaptiveThreadPool();
        
        // 提交任务
        List<Future<String>> futures = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            final int taskId = i;
            Future<String> future = adaptivePool.submit(() -> {
                try {
                    Thread.sleep(1000 + (int) (Math.random() * 1000));
                    return "任务 " + taskId + " 完成";
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return "任务 " + taskId + " 中断";
                }
            });
            futures.add(future);
        }
        
        // 等待所有任务完成
        for (Future<String> future : futures) {
            System.out.println(future.get());
        }
        
        adaptivePool.shutdown();
    }
}

3. 并发设计模式

生产者-消费者模式

java 复制代码
public class ProducerConsumerPattern {
    public static void main(String[] args) throws InterruptedException {
        // 1. 基本生产者-消费者
        demonstrateBasicProducerConsumer();
        
        // 2. 多生产者-多消费者
        demonstrateMultiProducerConsumer();
        
        // 3. 优先级生产者-消费者
        demonstratePriorityProducerConsumer();
    }
    
    private static void demonstrateBasicProducerConsumer() throws InterruptedException {
        System.out.println("=== 基本生产者-消费者 ===");
        
        BlockingQueue<String> queue = new LinkedBlockingQueue<>(10);
        
        // 生产者
        Thread producer = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                try {
                    queue.put("Item " + i);
                    System.out.println("生产: Item " + i);
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        });
        
        // 消费者
        Thread consumer = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                try {
                    String item = queue.take();
                    System.out.println("消费: " + item);
                    Thread.sleep(150);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        });
        
        producer.start();
        consumer.start();
        
        producer.join();
        consumer.join();
    }
    
    private static void demonstrateMultiProducerConsumer() throws InterruptedException {
        System.out.println("=== 多生产者-多消费者 ===");
        
        BlockingQueue<String> queue = new LinkedBlockingQueue<>(20);
        
        // 多个生产者
        List<Thread> producers = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            final int producerId = i;
            Thread producer = new Thread(() -> {
                for (int j = 0; j < 10; j++) {
                    try {
                        queue.put("Producer " + producerId + " - Item " + j);
                        System.out.println("生产者 " + producerId + " 生产: Item " + j);
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            });
            producers.add(producer);
        }
        
        // 多个消费者
        List<Thread> consumers = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            final int consumerId = i;
            Thread consumer = new Thread(() -> {
                for (int j = 0; j < 15; j++) {
                    try {
                        String item = queue.take();
                        System.out.println("消费者 " + consumerId + " 消费: " + item);
                        Thread.sleep(150);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            });
            consumers.add(consumer);
        }
        
        // 启动所有线程
        for (Thread producer : producers) {
            producer.start();
        }
        for (Thread consumer : consumers) {
            consumer.start();
        }
        
        // 等待所有线程完成
        for (Thread producer : producers) {
            producer.join();
        }
        for (Thread consumer : consumers) {
            consumer.join();
        }
    }
    
    private static void demonstratePriorityProducerConsumer() throws InterruptedException {
        System.out.println("=== 优先级生产者-消费者 ===");
        
        PriorityBlockingQueue<PriorityItem> queue = new PriorityBlockingQueue<>();
        
        // 生产者
        Thread producer = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                int priority = (int) (Math.random() * 10);
                PriorityItem item = new PriorityItem("Item " + i, priority);
                queue.put(item);
                System.out.println("生产: " + item);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        });
        
        // 消费者
        Thread consumer = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                try {
                    PriorityItem item = queue.take();
                    System.out.println("消费: " + item);
                    Thread.sleep(150);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        });
        
        producer.start();
        consumer.start();
        
        producer.join();
        consumer.join();
    }
    
    static class PriorityItem implements Comparable<PriorityItem> {
        private final String name;
        private final int priority;
        
        public PriorityItem(String name, int priority) {
            this.name = name;
            this.priority = priority;
        }
        
        @Override
        public int compareTo(PriorityItem other) {
            return Integer.compare(other.priority, this.priority); // 高优先级在前
        }
        
        @Override
        public String toString() {
            return name + " (优先级: " + priority + ")";
        }
    }
}

Future模式

java 复制代码
public class FuturePattern {
    public static void main(String[] args) throws InterruptedException {
        // 1. 基本Future模式
        demonstrateBasicFuture();
        
        // 2. 组合Future
        demonstrateComposedFuture();
        
        // 3. 超时处理
        demonstrateTimeoutHandling();
    }
    
    private static void demonstrateBasicFuture() throws InterruptedException {
        System.out.println("=== 基本Future模式 ===");
        
        ExecutorService executor = Executors.newFixedThreadPool(3);
        
        // 提交任务
        Future<String> future1 = executor.submit(() -> {
            Thread.sleep(1000);
            return "任务1完成";
        });
        
        Future<String> future2 = executor.submit(() -> {
            Thread.sleep(1500);
            return "任务2完成";
        });
        
        Future<String> future3 = executor.submit(() -> {
            Thread.sleep(800);
            return "任务3完成";
        });
        
        // 获取结果
        try {
            System.out.println(future1.get());
            System.out.println(future2.get());
            System.out.println(future3.get());
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        
        executor.shutdown();
    }
    
    private static void demonstrateComposedFuture() throws InterruptedException {
        System.out.println("=== 组合Future ===");
        
        ExecutorService executor = Executors.newFixedThreadPool(3);
        
        // 第一个任务
        Future<Integer> future1 = executor.submit(() -> {
            Thread.sleep(1000);
            return 10;
        });
        
        // 第二个任务
        Future<Integer> future2 = executor.submit(() -> {
            Thread.sleep(1500);
            return 20;
        });
        
        // 组合任务
        Future<Integer> combinedFuture = executor.submit(() -> {
            try {
                int result1 = future1.get();
                int result2 = future2.get();
                return result1 + result2;
            } catch (ExecutionException e) {
                throw new RuntimeException(e);
            }
        });
        
        try {
            System.out.println("组合结果: " + combinedFuture.get());
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        
        executor.shutdown();
    }
    
    private static void demonstrateTimeoutHandling() throws InterruptedException {
        System.out.println("=== 超时处理 ===");
        
        ExecutorService executor = Executors.newFixedThreadPool(2);
        
        // 长时间运行的任务
        Future<String> future = executor.submit(() -> {
            Thread.sleep(3000);
            return "长时间任务完成";
        });
        
        try {
            // 设置超时时间
            String result = future.get(2, TimeUnit.SECONDS);
            System.out.println("结果: " + result);
        } catch (TimeoutException e) {
            System.out.println("任务超时,取消执行");
            future.cancel(true);
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        
        executor.shutdown();
    }
}

工作窃取模式

java 复制代码
public class WorkStealingPattern {
    public static void main(String[] args) throws InterruptedException {
        // 1. ForkJoinPool工作窃取
        demonstrateForkJoinWorkStealing();
        
        // 2. 自定义工作窃取
        demonstrateCustomWorkStealing();
        
        // 3. 负载均衡
        demonstrateLoadBalancing();
    }
    
    private static void demonstrateForkJoinWorkStealing() throws InterruptedException {
        System.out.println("=== ForkJoinPool工作窃取 ===");
        
        ForkJoinPool pool = new ForkJoinPool();
        
        // 提交任务
        List<Future<String>> futures = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            final int taskId = i;
            Future<String> future = pool.submit(() -> {
                try {
                    Thread.sleep(1000 + (int) (Math.random() * 1000));
                    return "任务 " + taskId + " 完成";
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return "任务 " + taskId + " 中断";
                }
            });
            futures.add(future);
        }
        
        // 等待所有任务完成
        for (Future<String> future : futures) {
            System.out.println(future.get());
        }
        
        pool.shutdown();
    }
    
    private static void demonstrateCustomWorkStealing() throws InterruptedException {
        System.out.println("=== 自定义工作窃取 ===");
        
        WorkStealingQueue<String> queue = new WorkStealingQueue<>();
        
        // 添加任务
        for (int i = 0; i < 20; i++) {
            queue.add("任务 " + i);
        }
        
        // 创建工作线程
        List<Thread> workers = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            final int workerId = i;
            Thread worker = new Thread(() -> {
                while (true) {
                    String task = queue.steal();
                    if (task == null) {
                        break;
                    }
                    System.out.println("工作线程 " + workerId + " 处理: " + task);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            });
            workers.add(worker);
        }
        
        // 启动工作线程
        for (Thread worker : workers) {
            worker.start();
        }
        
        // 等待所有工作线程完成
        for (Thread worker : workers) {
            worker.join();
        }
    }
    
    private static void demonstrateLoadBalancing() throws InterruptedException {
        System.out.println("=== 负载均衡 ===");
        
        LoadBalancer loadBalancer = new LoadBalancer(4);
        
        // 提交任务
        List<Future<String>> futures = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            final int taskId = i;
            Future<String> future = loadBalancer.submit(() -> {
                try {
                    Thread.sleep(1000 + (int) (Math.random() * 1000));
                    return "任务 " + taskId + " 完成";
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return "任务 " + taskId + " 中断";
                }
            });
            futures.add(future);
        }
        
        // 等待所有任务完成
        for (Future<String> future : futures) {
            System.out.println(future.get());
        }
        
        loadBalancer.shutdown();
    }
    
    static class WorkStealingQueue<T> {
        private final Queue<T> queue = new ConcurrentLinkedQueue<>();
        
        public void add(T item) {
            queue.offer(item);
        }
        
        public T steal() {
            return queue.poll();
        }
    }
    
    static class LoadBalancer {
        private final List<ExecutorService> executors;
        private final AtomicInteger index = new AtomicInteger(0);
        
        public LoadBalancer(int poolCount) {
            executors = new ArrayList<>();
            for (int i = 0; i < poolCount; i++) {
                executors.add(Executors.newFixedThreadPool(2));
            }
        }
        
        public Future<String> submit(Callable<String> task) {
            int currentIndex = index.getAndIncrement() % executors.size();
            return executors.get(currentIndex).submit(task);
        }
        
        public void shutdown() {
            for (ExecutorService executor : executors) {
                executor.shutdown();
            }
        }
    }
}

Actor模型

java 复制代码
public class ActorModel {
    public static void main(String[] args) throws InterruptedException {
        // 1. 基本Actor
        demonstrateBasicActor();
        
        // 2. Actor通信
        demonstrateActorCommunication();
        
        // 3. Actor监督
        demonstrateActorSupervision();
    }
    
    private static void demonstrateBasicActor() throws InterruptedException {
        System.out.println("=== 基本Actor ===");
        
        ActorSystem system = new ActorSystem();
        
        // 创建Actor
        ActorRef counter = system.actorOf(CounterActor.class);
        
        // 发送消息
        counter.tell(new IncrementMessage());
        counter.tell(new IncrementMessage());
        counter.tell(new GetCountMessage());
        
        Thread.sleep(1000);
        system.shutdown();
    }
    
    private static void demonstrateActorCommunication() throws InterruptedException {
        System.out.println("=== Actor通信 ===");
        
        ActorSystem system = new ActorSystem();
        
        // 创建Actor
        ActorRef sender = system.actorOf(SenderActor.class);
        ActorRef receiver = system.actorOf(ReceiverActor.class);
        
        // 发送消息
        sender.tell(new SendMessage("Hello", receiver));
        
        Thread.sleep(1000);
        system.shutdown();
    }
    
    private static void demonstrateActorSupervision() throws InterruptedException {
        System.out.println("=== Actor监督 ===");
        
        ActorSystem system = new ActorSystem();
        
        // 创建监督Actor
        ActorRef supervisor = system.actorOf(SupervisorActor.class);
        
        // 发送消息
        supervisor.tell(new CreateChildMessage());
        supervisor.tell(new SendMessage("Test", null));
        
        Thread.sleep(1000);
        system.shutdown();
    }
    
    // 消息类
    static class IncrementMessage {}
    static class GetCountMessage {}
    static class SendMessage {
        private final String content;
        private final ActorRef target;
        
        public SendMessage(String content, ActorRef target) {
            this.content = content;
            this.target = target;
        }
        
        public String getContent() { return content; }
        public ActorRef getTarget() { return target; }
    }
    static class CreateChildMessage {}
    
    // Actor引用
    static class ActorRef {
        private final Actor actor;
        private final ExecutorService executor;
        
        public ActorRef(Actor actor, ExecutorService executor) {
            this.actor = actor;
            this.executor = executor;
        }
        
        public void tell(Object message) {
            executor.submit(() -> actor.receive(message));
        }
    }
    
    // Actor基类
    static abstract class Actor {
        protected ActorRef self;
        protected ActorRef parent;
        
        public void setSelf(ActorRef self) {
            this.self = self;
        }
        
        public void setParent(ActorRef parent) {
            this.parent = parent;
        }
        
        public abstract void receive(Object message);
    }
    
    // 计数器Actor
    static class CounterActor extends Actor {
        private int count = 0;
        
        @Override
        public void receive(Object message) {
            if (message instanceof IncrementMessage) {
                count++;
                System.out.println("计数器增加到: " + count);
            } else if (message instanceof GetCountMessage) {
                System.out.println("当前计数: " + count);
            }
        }
    }
    
    // 发送者Actor
    static class SenderActor extends Actor {
        @Override
        public void receive(Object message) {
            if (message instanceof SendMessage) {
                SendMessage msg = (SendMessage) message;
                System.out.println("发送消息: " + msg.getContent());
                if (msg.getTarget() != null) {
                    msg.getTarget().tell(msg);
                }
            }
        }
    }
    
    // 接收者Actor
    static class ReceiverActor extends Actor {
        @Override
        public void receive(Object message) {
            if (message instanceof SendMessage) {
                SendMessage msg = (SendMessage) message;
                System.out.println("接收消息: " + msg.getContent());
            }
        }
    }
    
    // 监督者Actor
    static class SupervisorActor extends Actor {
        private final List<ActorRef> children = new ArrayList<>();
        
        @Override
        public void receive(Object message) {
            if (message instanceof CreateChildMessage) {
                // 创建子Actor
                ActorRef child = new ActorRef(new ChildActor(), Executors.newSingleThreadExecutor());
                child.setParent(self);
                children.add(child);
                System.out.println("创建子Actor");
            } else if (message instanceof SendMessage) {
                // 转发消息给子Actor
                if (!children.isEmpty()) {
                    children.get(0).tell(message);
                }
            }
        }
    }
    
    // 子Actor
    static class ChildActor extends Actor {
        @Override
        public void receive(Object message) {
            if (message instanceof SendMessage) {
                SendMessage msg = (SendMessage) message;
                System.out.println("子Actor接收消息: " + msg.getContent());
            }
        }
    }
    
    // Actor系统
    static class ActorSystem {
        private final ExecutorService executor = Executors.newCachedThreadPool();
        private final List<ActorRef> actors = new ArrayList<>();
        
        public ActorRef actorOf(Class<? extends Actor> actorClass) {
            try {
                Actor actor = actorClass.newInstance();
                ActorRef actorRef = new ActorRef(actor, executor);
                actor.setSelf(actorRef);
                actors.add(actorRef);
                return actorRef;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        
        public void shutdown() {
            executor.shutdown();
        }
    }
}

4. 虚拟线程 + 平台线程的混合模型

混合模型设计

java 复制代码
public class HybridThreadModel {
    public static void main(String[] args) throws InterruptedException {
        // 1. 基本混合模型
        demonstrateBasicHybridModel();
        
        // 2. 任务分类处理
        demonstrateTaskClassification();
        
        // 3. 性能优化
        demonstratePerformanceOptimization();
    }
    
    private static void demonstrateBasicHybridModel() throws InterruptedException {
        System.out.println("=== 基本混合模型 ===");
        
        // 平台线程池(CPU密集型任务)
        ExecutorService platformExecutor = Executors.newFixedThreadPool(
            Runtime.getRuntime().availableProcessors()
        );
        
        // 虚拟线程池(I/O密集型任务)
        ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
        
        // 提交CPU密集型任务到平台线程池
        List<Future<String>> cpuFutures = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            final int taskId = i;
            Future<String> future = platformExecutor.submit(() -> {
                // CPU密集型计算
                long sum = 0;
                for (int j = 0; j < 1000000; j++) {
                    sum += j;
                }
                return "CPU任务 " + taskId + " 完成,结果: " + sum;
            });
            cpuFutures.add(future);
        }
        
        // 提交I/O密集型任务到虚拟线程池
        List<Future<String>> ioFutures = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            Future<String> future = virtualExecutor.submit(() -> {
                // I/O密集型操作
                try {
                    Thread.sleep(1000);
                    return "I/O任务 " + taskId + " 完成";
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return "I/O任务 " + taskId + " 中断";
                }
            });
            ioFutures.add(future);
        }
        
        // 等待所有任务完成
        for (Future<String> future : cpuFutures) {
            System.out.println(future.get());
        }
        
        for (Future<String> future : ioFutures) {
            System.out.println(future.get());
        }
        
        platformExecutor.shutdown();
        virtualExecutor.shutdown();
    }
    
    private static void demonstrateTaskClassification() throws InterruptedException {
        System.out.println("=== 任务分类处理 ===");
        
        TaskClassifier classifier = new TaskClassifier();
        
        // 提交不同类型的任务
        List<Future<String>> futures = new ArrayList<>();
        
        // CPU密集型任务
        futures.add(classifier.submit(new CPUTask("CPU任务1")));
        futures.add(classifier.submit(new CPUTask("CPU任务2")));
        
        // I/O密集型任务
        futures.add(classifier.submit(new IOTask("I/O任务1")));
        futures.add(classifier.submit(new IOTask("I/O任务2")));
        futures.add(classifier.submit(new IOTask("I/O任务3")));
        
        // 混合任务
        futures.add(classifier.submit(new MixedTask("混合任务1")));
        futures.add(classifier.submit(new MixedTask("混合任务2")));
        
        // 等待所有任务完成
        for (Future<String> future : futures) {
            System.out.println(future.get());
        }
        
        classifier.shutdown();
    }
    
    private static void demonstratePerformanceOptimization() throws InterruptedException {
        System.out.println("=== 性能优化 ===");
        
        OptimizedHybridExecutor executor = new OptimizedHybridExecutor();
        
        // 提交任务
        List<Future<String>> futures = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            final int taskId = i;
            Future<String> future = executor.submit(() -> {
                // 模拟任务
                try {
                    Thread.sleep(100);
                    return "任务 " + taskId + " 完成";
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return "任务 " + taskId + " 中断";
                }
            });
            futures.add(future);
        }
        
        // 等待所有任务完成
        for (Future<String> future : futures) {
            System.out.println(future.get());
        }
        
        executor.shutdown();
    }
    
    // 任务分类器
    static class TaskClassifier {
        private final ExecutorService platformExecutor = Executors.newFixedThreadPool(
            Runtime.getRuntime().availableProcessors()
        );
        private final ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
        
        public Future<String> submit(Task task) {
            if (task instanceof CPUTask) {
                return platformExecutor.submit(task);
            } else if (task instanceof IOTask) {
                return virtualExecutor.submit(task);
            } else {
                // 混合任务,根据当前负载选择
                if (platformExecutor.getActiveCount() < platformExecutor.getCorePoolSize()) {
                    return platformExecutor.submit(task);
                } else {
                    return virtualExecutor.submit(task);
                }
            }
        }
        
        public void shutdown() {
            platformExecutor.shutdown();
            virtualExecutor.shutdown();
        }
    }
    
    // 任务基类
    static abstract class Task implements Callable<String> {
        protected final String name;
        
        public Task(String name) {
            this.name = name;
        }
    }
    
    // CPU密集型任务
    static class CPUTask extends Task {
        public CPUTask(String name) {
            super(name);
        }
        
        @Override
        public String call() {
            // CPU密集型计算
            long sum = 0;
            for (int i = 0; i < 1000000; i++) {
                sum += i;
            }
            return name + " 完成,结果: " + sum;
        }
    }
    
    // I/O密集型任务
    static class IOTask extends Task {
        public IOTask(String name) {
            super(name);
        }
        
        @Override
        public String call() throws InterruptedException {
            // I/O密集型操作
            Thread.sleep(1000);
            return name + " 完成";
        }
    }
    
    // 混合任务
    static class MixedTask extends Task {
        public MixedTask(String name) {
            super(name);
        }
        
        @Override
        public String call() throws InterruptedException {
            // 混合操作
            long sum = 0;
            for (int i = 0; i < 100000; i++) {
                sum += i;
            }
            Thread.sleep(500);
            return name + " 完成,结果: " + sum;
        }
    }
    
    // 优化的混合执行器
    static class OptimizedHybridExecutor {
        private final ExecutorService platformExecutor = Executors.newFixedThreadPool(
            Runtime.getRuntime().availableProcessors()
        );
        private final ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();
        private final AtomicInteger taskCount = new AtomicInteger(0);
        
        public Future<String> submit(Callable<String> task) {
            taskCount.incrementAndGet();
            
            // 根据任务数量动态选择执行器
            if (taskCount.get() % 2 == 0) {
                return platformExecutor.submit(task);
            } else {
                return virtualExecutor.submit(task);
            }
        }
        
        public void shutdown() {
            platformExecutor.shutdown();
            virtualExecutor.shutdown();
        }
    }
}

5. Java并发未来趋势:结构化并发

结构化并发概念

java 复制代码
public class StructuredConcurrency {
    public static void main(String[] args) throws InterruptedException {
        // 1. 基本结构化并发
        demonstrateBasicStructuredConcurrency();
        
        // 2. 异常处理
        demonstrateExceptionHandling();
        
        // 3. 资源管理
        demonstrateResourceManagement();
    }
    
    private static void demonstrateBasicStructuredConcurrency() throws InterruptedException {
        System.out.println("=== 基本结构化并发 ===");
        
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            // 提交多个相关任务
            List<Future<String>> futures = new ArrayList<>();
            
            for (int i = 0; i < 5; i++) {
                final int taskId = i;
                Future<String> future = executor.submit(() -> {
                    try {
                        Thread.sleep(1000);
                        return "任务 " + taskId + " 完成";
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        return "任务 " + taskId + " 中断";
                    }
                });
                futures.add(future);
            }
            
            // 等待所有任务完成
            for (Future<String> future : futures) {
                System.out.println(future.get());
            }
        }
    }
    
    private static void demonstrateExceptionHandling() throws InterruptedException {
        System.out.println("=== 异常处理 ===");
        
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            List<Future<String>> futures = new ArrayList<>();
            
            for (int i = 0; i < 5; i++) {
                final int taskId = i;
                Future<String> future = executor.submit(() -> {
                    if (taskId == 2) {
                        throw new RuntimeException("任务 " + taskId + " 失败");
                    }
                    try {
                        Thread.sleep(1000);
                        return "任务 " + taskId + " 完成";
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        return "任务 " + taskId + " 中断";
                    }
                });
                futures.add(future);
            }
            
            // 处理结果和异常
            for (Future<String> future : futures) {
                try {
                    System.out.println(future.get());
                } catch (ExecutionException e) {
                    System.out.println("任务异常: " + e.getCause().getMessage());
                }
            }
        }
    }
    
    private static void demonstrateResourceManagement() throws InterruptedException {
        System.out.println("=== 资源管理 ===");
        
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            List<Future<String>> futures = new ArrayList<>();
            
            for (int i = 0; i < 3; i++) {
                final int taskId = i;
                Future<String> future = executor.submit(() -> {
                    try (Resource resource = new Resource("资源 " + taskId)) {
                        Thread.sleep(1000);
                        return "任务 " + taskId + " 完成,使用 " + resource.getName();
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        return "任务 " + taskId + " 中断";
                    }
                });
                futures.add(future);
            }
            
            for (Future<String> future : futures) {
                System.out.println(future.get());
            }
        }
    }
    
    // 资源类
    static class Resource implements AutoCloseable {
        private final String name;
        
        public Resource(String name) {
            this.name = name;
            System.out.println("创建资源: " + name);
        }
        
        public String getName() {
            return name;
        }
        
        @Override
        public void close() {
            System.out.println("释放资源: " + name);
        }
    }
}

结构化并发最佳实践

java 复制代码
public class StructuredConcurrencyBestPractices {
    public static void main(String[] args) throws InterruptedException {
        // 1. 任务分组
        demonstrateTaskGrouping();
        
        // 2. 超时控制
        demonstrateTimeoutControl();
        
        // 3. 取消操作
        demonstrateCancellation();
    }
    
    private static void demonstrateTaskGrouping() throws InterruptedException {
        System.out.println("=== 任务分组 ===");
        
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            // 第一组任务
            List<Future<String>> group1 = new ArrayList<>();
            for (int i = 0; i < 3; i++) {
                final int taskId = i;
                Future<String> future = executor.submit(() -> {
                    Thread.sleep(1000);
                    return "组1任务 " + taskId + " 完成";
                });
                group1.add(future);
            }
            
            // 第二组任务
            List<Future<String>> group2 = new ArrayList<>();
            for (int i = 0; i < 3; i++) {
                final int taskId = i;
                Future<String> future = executor.submit(() -> {
                    Thread.sleep(1500);
                    return "组2任务 " + taskId + " 完成";
                });
                group2.add(future);
            }
            
            // 等待第一组完成
            System.out.println("第一组任务结果:");
            for (Future<String> future : group1) {
                System.out.println(future.get());
            }
            
            // 等待第二组完成
            System.out.println("第二组任务结果:");
            for (Future<String> future : group2) {
                System.out.println(future.get());
            }
        }
    }
    
    private static void demonstrateTimeoutControl() throws InterruptedException {
        System.out.println("=== 超时控制 ===");
        
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            List<Future<String>> futures = new ArrayList<>();
            
            for (int i = 0; i < 5; i++) {
                final int taskId = i;
                Future<String> future = executor.submit(() -> {
                    Thread.sleep(2000);
                    return "任务 " + taskId + " 完成";
                });
                futures.add(future);
            }
            
            // 设置超时时间
            long timeout = 3000; // 3秒
            long start = System.currentTimeMillis();
            
            for (Future<String> future : futures) {
                try {
                    long remaining = timeout - (System.currentTimeMillis() - start);
                    if (remaining <= 0) {
                        System.out.println("超时,取消剩余任务");
                        future.cancel(true);
                        break;
                    }
                    
                    String result = future.get(remaining, TimeUnit.MILLISECONDS);
                    System.out.println(result);
                } catch (TimeoutException e) {
                    System.out.println("任务超时,取消执行");
                    future.cancel(true);
                }
            }
        }
    }
    
    private static void demonstrateCancellation() throws InterruptedException {
        System.out.println("=== 取消操作 ===");
        
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            List<Future<String>> futures = new ArrayList<>();
            
            for (int i = 0; i < 5; i++) {
                final int taskId = i;
                Future<String> future = executor.submit(() -> {
                    try {
                        Thread.sleep(5000);
                        return "任务 " + taskId + " 完成";
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        return "任务 " + taskId + " 被取消";
                    }
                });
                futures.add(future);
            }
            
            // 等待一段时间后取消所有任务
            Thread.sleep(2000);
            
            for (Future<String> future : futures) {
                future.cancel(true);
            }
            
            // 检查任务状态
            for (int i = 0; i < futures.size(); i++) {
                Future<String> future = futures.get(i);
                if (future.isCancelled()) {
                    System.out.println("任务 " + i + " 已取消");
                } else {
                    try {
                        System.out.println(future.get());
                    } catch (ExecutionException e) {
                        System.out.println("任务 " + i + " 执行异常: " + e.getCause().getMessage());
                    }
                }
            }
        }
    }
}

实践练习

练习1:性能监控系统

java 复制代码
public class PerformanceMonitoringSystem {
    private final AtomicLong totalRequests = new AtomicLong(0);
    private final AtomicLong successfulRequests = new AtomicLong(0);
    private final AtomicLong failedRequests = new AtomicLong(0);
    private final AtomicLong totalResponseTime = new AtomicLong(0);
    private final ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
    
    public void processRequest(String requestId) {
        long startTime = System.currentTimeMillis();
        totalRequests.incrementAndGet();
        
        try {
            // 模拟请求处理
            Thread.sleep(100 + (int) (Math.random() * 200));
            
            // 模拟成功或失败
            if (Math.random() > 0.1) {
                successfulRequests.incrementAndGet();
                System.out.println("请求 " + requestId + " 处理成功");
            } else {
                failedRequests.incrementAndGet();
                System.out.println("请求 " + requestId + " 处理失败");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            failedRequests.incrementAndGet();
        } finally {
            long responseTime = System.currentTimeMillis() - startTime;
            totalResponseTime.addAndGet(responseTime);
        }
    }
    
    public void printStatistics() {
        long total = totalRequests.get();
        long successful = successfulRequests.get();
        long failed = failedRequests.get();
        long avgResponseTime = total > 0 ? totalResponseTime.get() / total : 0;
        
        System.out.println("=== 性能统计 ===");
        System.out.println("总请求数: " + total);
        System.out.println("成功请求数: " + successful);
        System.out.println("失败请求数: " + failed);
        System.out.println("成功率: " + (total > 0 ? (double) successful / total * 100 : 0) + "%");
        System.out.println("平均响应时间: " + avgResponseTime + "ms");
    }
    
    public void shutdown() {
        executor.shutdown();
    }
    
    public static void main(String[] args) throws InterruptedException {
        PerformanceMonitoringSystem system = new PerformanceMonitoringSystem();
        
        // 模拟处理请求
        for (int i = 0; i < 100; i++) {
            final int requestId = i;
            system.executor.submit(() -> {
                system.processRequest("REQ-" + requestId);
            });
        }
        
        // 等待所有请求完成
        Thread.sleep(5000);
        
        // 打印统计信息
        system.printStatistics();
        
        system.shutdown();
    }
}

练习2:高并发缓存系统

java 复制代码
public class HighConcurrencyCacheSystem {
    private final ConcurrentHashMap<String, CacheEntry> cache = new ConcurrentHashMap<>();
    private final ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
    private final AtomicLong hits = new AtomicLong(0);
    private final AtomicLong misses = new AtomicLong(0);
    
    public String get(String key) {
        CacheEntry entry = cache.get(key);
        if (entry != null && !entry.isExpired()) {
            hits.incrementAndGet();
            return entry.getValue();
        } else {
            misses.incrementAndGet();
            return null;
        }
    }
    
    public void put(String key, String value, long ttl) {
        CacheEntry entry = new CacheEntry(value, System.currentTimeMillis() + ttl);
        cache.put(key, entry);
    }
    
    public void remove(String key) {
        cache.remove(key);
    }
    
    public void clear() {
        cache.clear();
    }
    
    public void printStatistics() {
        long total = hits.get() + misses.get();
        double hitRate = total > 0 ? (double) hits.get() / total * 100 : 0;
        
        System.out.println("=== 缓存统计 ===");
        System.out.println("缓存大小: " + cache.size());
        System.out.println("命中次数: " + hits.get());
        System.out.println("未命中次数: " + misses.get());
        System.out.println("命中率: " + hitRate + "%");
    }
    
    public void shutdown() {
        executor.shutdown();
    }
    
    static class CacheEntry {
        private final String value;
        private final long expirationTime;
        
        public CacheEntry(String value, long expirationTime) {
            this.value = value;
            this.expirationTime = expirationTime;
        }
        
        public String getValue() {
            return value;
        }
        
        public boolean isExpired() {
            return System.currentTimeMillis() > expirationTime;
        }
    }
    
    public static void main(String[] args) throws InterruptedException {
        HighConcurrencyCacheSystem cache = new HighConcurrencyCacheSystem();
        
        // 模拟并发访问
        List<Future<Void>> futures = new ArrayList<>();
        
        for (int i = 0; i < 1000; i++) {
            final int taskId = i;
            Future<Void> future = cache.executor.submit(() -> {
                String key = "key" + (taskId % 100);
                String value = cache.get(key);
                
                if (value == null) {
                    cache.put(key, "value" + taskId, 5000);
                }
                
                return null;
            });
            futures.add(future);
        }
        
        // 等待所有任务完成
        for (Future<Void> future : futures) {
            future.get();
        }
        
        // 打印统计信息
        cache.printStatistics();
        
        cache.shutdown();
    }
}

总结

本部分深入介绍了性能优化、调试与并发设计模式:

  1. 性能测试工具:JMH、VisualVM、Flight Recorder的使用
  2. 线程池调优:参数优化、背压控制、自适应调整
  3. 并发设计模式:生产者-消费者、Future、工作窃取、Actor模型
  4. 混合模型:虚拟线程与平台线程的结合使用
  5. 结构化并发:Java并发的未来趋势
  6. 最佳实践:性能监控、缓存系统等实际应用

这些知识是构建高质量、高性能并发系统的关键,掌握了这些内容,就能够设计和实现优秀的并发应用程序。

相关推荐
u0103055272 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055272 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝4 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055274 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055274 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055277 天前
Java实用类应用精讲
人工智能·1024程序员节
u0103055277 天前
Java I/O核心操作实战
人工智能·1024程序员节
u0103055278 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u0103055279 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节
u01030552710 天前
使用BufferedReader读取控制台输入
人工智能·1024程序员节