Java线程池的使用

简介: 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月前
|
Java
Java线程池的理解和使用
Java线程池的理解和使用
71 0
|
18天前
|
监控 Java
Java线程池的使用
Java线程池的使用
|
4月前
|
缓存 安全 Java
java线程池
java线程池
28 0
|
6月前
|
存储 缓存 监控
Java线程池
Java线程池
75 1
|
6月前
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解08-阻塞队列之LinkedBlockingDeque
**摘要:** 本文分析了Java中的LinkedBlockingDeque,它是一个基于链表实现的双端阻塞队列,具有并发安全性。LinkedBlockingDeque可以作为有界队列使用,容量由构造函数指定,默认为Integer.MAX_VALUE。队列操作包括在头部和尾部的插入与删除,这些操作由锁和Condition来保证线程安全。例如,`linkFirst()`和`linkLast()`用于在队首和队尾插入元素,而`unlinkFirst()`和`unlinkLast()`则用于删除首尾元素。队列的插入和删除方法根据队列是否满或空,可能会阻塞或唤醒等待的线程,这些操作通过`notFul
314 5
|
Java 调度
Java线程池中哪些事??
Java线程池中哪些事??
44 0
|
监控 Java 调度
JAVA线程池
想象一下,你是一个忙碌的领导,手头有一堆任务要完成。你一个人怎么可能同时完成这么多任务呢?于是乎,你决定雇佣一支“Java线程池服务团队”。 这个团队里有很多个“小伙伴”(线程),他们每个人都有各自的技能和专长。当你有新的任务时,你只需要把任务交给团队负责人(线程池)就好了。 团队负责人(线程池)会根据任务的复杂度和优先级,选择合适的小伙伴(线程)来处理任务。有些任务可能很简单,只需要一个小伙伴就能搞定;有些任务可能很复杂,需要几个小伙伴共同协作。 Java线程池是一种用于管理和复用线程的机制,它可以在需要执行任务时,从线程池中获取一个空闲线程来执行任务,而不是每次都创建新的线程。线程池可以提
53 0
|
缓存 安全 Java
Java线程池详解
线程池必须要记住哪几个参数?线程池添加线程有哪些规则?线程池是手动创建还是自动创建好?线程池怎么暂停与恢复?线程池是如何实现线程复用的?本文带你一探究竟!
199 0
Java线程池详解
|
缓存 Java
【Java线程池详解】—— 每天一点小知识
【Java线程池详解】—— 每天一点小知识
137 1
|
Java 调度