【10月更文挑战第2天】Java线程池的使用

简介: 【10月更文挑战第2天】Java线程池的使用

Java 线程池是一种执行器(Executor),用于在一个后台线程中执行任务。线程池的主要目的是减少在创建和销毁线程时所产生的性能开销。通过重用已经创建的线程来执行新的任务,线程池提高了程序的响应速度,并且提供了更好的系统资源管理。

以下是 Java 线程池的一些基本使用方法:

  1. 创建线程池
    Java 提供了 Executors 工厂类来创建不同类型的线程池。

    // 创建一个固定大小的线程池
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
    
    // 创建一个可缓存的线程池,它会根据需要创建新线程
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    
    // 创建一个单线程的执行器
    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    
    // 创建一个定时以及周期性任务的线程池
    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
    
  2. 提交任务给线程池

    • 提交 Runnable 任务:

      fixedThreadPool.execute(new Runnable() {
             
          public void run() {
             
              // 任务代码
          }
      });
      
    • 提交 Callable 任务,并获取 Future 对象:

      Callable<String> callable = new Callable<String>() {
             
          public String call() throws Exception {
             
              return "任务结果";
          }
      };
      Future<String> future = fixedThreadPool.submit(callable);
      String result = future.get(); // 获取任务结果
      
  3. 关闭线程池

    • 平滑关闭线程池,执行已提交的任务,不接受新任务:

      fixedThreadPool.shutdown();
      
    • 尝试立即停止所有正在执行的任务,暂停处理等待的任务,并返回等待执行的任务列表:

      List<Runnable> notExecutedTasks = fixedThreadPool.shutdownNow();
      
  4. 等待线程池终止

    • 在调用 shutdown 方法后,可以调用 awaitTermination 方法等待所有任务完成:

      fixedThreadPool.shutdown();
      try {
             
          if (!fixedThreadPool.awaitTermination(60, TimeUnit.SECONDS)) {
             
              fixedThreadPool.shutdownNow();
          }
      } catch (InterruptedException e) {
             
          fixedThreadPool.shutdownNow();
      }
      
  5. 自定义线程池

    • 可以通过构造函数自定义线程池的参数:

      int corePoolSize = 4;
      int maximumPoolSize = 10;
      long keepAliveTime = 120;
      TimeUnit unit = TimeUnit.SECONDS;
      BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
      ThreadFactory threadFactory = Executors.defaultThreadFactory();
      RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
      ExecutorService customThreadPool = new ThreadPoolExecutor(
          corePoolSize,
          maximumPoolSize,
          keepAliveTime,
          unit,
          workQueue,
          threadFactory,
          handler
      );
      
  6. 处理拒绝的任务

    • 可以通过实现 RejectedExecutionHandler 接口来处理当任务被拒绝时的行为:

      class MyRejectedExecutionHandler implements RejectedExecutionHandler {
             
          public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
             
              // 处理拒绝任务的逻辑
          }
      }
      
  7. 监控线程池

    • 可以通过 ThreadPoolExecutor 提供的方法来监控线程池的状态:

      long activeCount = customThreadPool.getActiveCount();
      long taskCount = customThreadPool.getTaskCount();
      

使用线程池时,应该根据应用程序的实际需求来选择合适的线程池类型和参数,以确保资源的有效利用和应用程序的性能。同时,合理地关闭线程池也是非常重要的,以避免资源泄露。

相关文章
|
19天前
【12月更文挑战第14天】
【12月更文挑战第14天】
39 8
|
2月前
【11月更文挑战第25天】
【11月更文挑战第25天】
28 0
|
3月前
|
消息中间件
【10月更文挑战第2天】确认机制(Acknowledgements)
【10月更文挑战第2天】确认机制(Acknowledgements)
|
13天前
|
SQL 关系型数据库 MySQL
【12月更文挑战第20天】
【12月更文挑战第20天】
33 20
|
15天前
【12月更文挑战第18天】
【12月更文挑战第18天】
63 21
|
9天前
|
机器学习/深度学习 PyTorch TensorFlow
【12月更文挑战第24天】
【12月更文挑战第24天】
28 9
|
16天前
|
Java 开发者
【12月更文挑战第17天】
【12月更文挑战第17天】
48 16
|
22天前
【12月更文挑战第11天】
【12月更文挑战第11天】
54 21
|
10天前
|
Python
【12月更文挑战第23天】
【12月更文挑战第23天】
22 5
|
20天前
|
Linux 数据安全/隐私保护 Python
【12月更文挑战第13天】
【12月更文挑战第13天】
44 12