【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();
      

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

相关文章
|
6月前
|
前端开发 JavaScript API
No100.精选前端面试题,享受每天的挑战和学习(事件循环)
No100.精选前端面试题,享受每天的挑战和学习(事件循环)
|
6月前
|
存储 缓存 Java
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
82 1
|
4天前
【11月更文挑战第25天】
【11月更文挑战第25天】
15 0
|
1月前
|
消息中间件
【10月更文挑战第2天】确认机制(Acknowledgements)
【10月更文挑战第2天】确认机制(Acknowledgements)
|
23小时前
【11月更文挑战第29天】
【11月更文挑战第29天】
9 4
|
2天前
|
索引
【11月更文挑战第27天】
【11月更文挑战第27天】
13 5
|
1天前
|
存储
【11月更文挑战第28天】
【11月更文挑战第28天】
14 3
|
3天前
|
索引
【11月更文挑战第26天】
【11月更文挑战第26天】
9 2
|
21天前
|
机器学习/深度学习 算法 云计算
探索无界:我的技术之旅与感悟####
【10月更文挑战第29天】 在技术的浩瀚星海里,我如同一名初出茅庐的航海家,驾驶着名为“好奇心”的小舟,穿梭于知识的岛屿之间。本文不仅是一次技术的探索之旅,更是一场心灵的洗礼。从最初的迷茫与困惑,到后来的顿悟与成长,每一步都凝聚着汗水与智慧的结晶。这不仅仅是一篇关于技术的文章,它还是个人成长、自我超越的见证。在这里,我将分享几个关键技术领域的深入探索,以及这些经历如何塑造了我的技术哲学和人生观。 ####
26 2
|
3月前
|
Python
【8月更文挑战第23天】
【8月更文挑战第23天】 【8月更文挑战第23天】
36 0
下一篇
无影云桌面