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

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

相关文章
|
7月前
|
Java
Java线程池的理解和使用
Java线程池的理解和使用
73 0
|
2月前
|
监控 Java
Java线程池的使用
Java线程池的使用
|
5月前
|
缓存 安全 Java
java线程池
java线程池
30 0
|
7月前
|
存储 缓存 监控
Java线程池
Java线程池
78 1
|
Java 调度
Java线程池中哪些事??
Java线程池中哪些事??
46 0
|
监控 Java 调度
JAVA线程池
想象一下,你是一个忙碌的领导,手头有一堆任务要完成。你一个人怎么可能同时完成这么多任务呢?于是乎,你决定雇佣一支“Java线程池服务团队”。 这个团队里有很多个“小伙伴”(线程),他们每个人都有各自的技能和专长。当你有新的任务时,你只需要把任务交给团队负责人(线程池)就好了。 团队负责人(线程池)会根据任务的复杂度和优先级,选择合适的小伙伴(线程)来处理任务。有些任务可能很简单,只需要一个小伙伴就能搞定;有些任务可能很复杂,需要几个小伙伴共同协作。 Java线程池是一种用于管理和复用线程的机制,它可以在需要执行任务时,从线程池中获取一个空闲线程来执行任务,而不是每次都创建新的线程。线程池可以提
54 0
|
缓存 安全 Java
Java线程池详解
线程池必须要记住哪几个参数?线程池添加线程有哪些规则?线程池是手动创建还是自动创建好?线程池怎么暂停与恢复?线程池是如何实现线程复用的?本文带你一探究竟!
205 0
Java线程池详解
|
缓存 Java
【Java线程池详解】—— 每天一点小知识
【Java线程池详解】—— 每天一点小知识
138 1
|
Java 调度
|
监控 Java 调度
Java线程池介绍
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。
144 0
Java线程池介绍