跳至主要內容

Java并发编程:概述

程序猿DD原创JavaJava大约 3 分钟

Java并发编程:概述

在本教程中,我们将学习Java平台5.0版本引入的高级并发特性。

这些特性大多通过java.util.concurrent包实现。

一、Executor框架核心优势

Executor框架通过以下特性提升并发编程体验:

  1. 任务与执行解耦:只需实现Runnable任务,无需关心线程创建/销毁
  2. 线程池管理
    // 传统线程创建方式
    new Thread(new RunnableTask()).start();
    
    // 使用Executor框架
    Executor executor = Executors.newFixedThreadPool(10);
    executor.execute(new RunnableTask());
    
  3. Callable接口增强
    • 支持返回值(替代无返回的Runnable)
    • 通过Future对象管理任务状态

二、Executor接口体系

java.util.concurrent包定义了三级接口:

1. Executor 基础接口

public interface Executor {
    void execute(Runnable command);
}
  • 核心方法:提交Runnable任务
  • 实现类:ThreadPoolExecutor

2. ExecutorService 扩展接口

public interface ExecutorService extends Executor {
    <T> Future<T> submit(Callable<T> task);
    void shutdown();
    // ...其他生命周期管理方法
}
  • 支持提交Callable任务
  • 提供任务生命周期管理(关闭、等待终止等)

3. ScheduledExecutorService 定时任务接口

public interface ScheduledExecutorService extends ExecutorService {
    ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit);
    ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
}
  • 支持延迟执行和周期性任务
  • 返回ScheduledFuture对象

三、Future与Callable接口

1. Callable接口

@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}
  • 替代Runnable的有返回值任务
  • 允许抛出受检异常

2. Future接口

public interface Future<V> {
    V get() throws InterruptedException, ExecutionException;
    boolean cancel(boolean mayInterruptIfRunning);
    // ...其他状态查询方法
}
  • 管理异步任务结果
  • 支持取消任务和超时控制

四、Executors工厂类

提供便捷的线程池创建方法:

方法名称描述
newSingleThreadExecutor()创建单线程线程池,确保任务按顺序执行
newFixedThreadPool(int n)创建固定大小的线程池,重用线程处理新任务
newCachedThreadPool()缓存型线程池,根据负载动态调整线程数量
newScheduledThreadPool(int n)创建支持定时任务的线程池,适用于周期性执行场景

五、核心实现示例

1. 基础任务提交

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(() -> System.out.println("Runnable task executed"));

2. Callable任务与Future

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
    Thread.sleep(1000);
    return "Task completed";
});

try {
    String result = future.get(2, TimeUnit.SECONDS); // 带超时的获取结果
    System.out.println("Result: " + result);
} catch (TimeoutException e) {
    future.cancel(true); // 超时后取消任务
}

3. 定时任务示例

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(
    () -> System.out.println("Scheduled task executed"),
    0,        // 初始延迟
    1,        // 执行间隔
    TimeUnit.SECONDS
);

六、最佳实践建议

  1. 优先使用工厂方法:通过Executors创建线程池,避免直接使用ThreadPoolExecutor构造函数
  2. 合理配置线程池参数
    • CPU密集型任务:线程数≈CPU核心数
    • I/O密集型任务:线程数可适当增加
  3. 正确关闭ExecutorService
    executor.shutdown();
    try {
        if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
            executor.shutdownNow();
        }
    } catch (InterruptedException e) {
        executor.shutdownNow();
    }
    
  4. 监控线程池状态:通过ThreadPoolExecutorgetActiveCount()等方法监控运行状态

通过本教程,您将掌握Java并发编程的核心工具,在保证线程安全的同时提升应用性能。

上次编辑于:
贡献者: 程序猿DD