线城池--Executor

2024-04-14 01:20
文章标签 executor 城池

本文主要是介绍线城池--Executor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Executors 

      线程池(ThreadPool)是一种用来管理线程的机制,它维护着一个线程队列,用于执行任务。线程池提供了一种限制线程数量和重用线程的方式,可以更加有效地利用系统资源,提高系统的性能。

Java中的线程池由java.util.concurrent.Executor框架提供,其中一个实现是线程池Executor。Executor框架中的线程池主要由以下三个部分组成:

  1. 任务队列(Task Queue):存放等待执行的任务。
  2. 工作线程(Worker Threads):执行任务的线程。
  3. 线程池管理器(Thread Pool Manager):负责启动、关闭线程池。

下面是一个简单的示例,演示如何使用线程池Executor:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建线程池,固定线程数量为3ExecutorService executor = Executors.newFixedThreadPool(3);// 提交任务给线程池for (int i = 1; i <= 10; i++) {int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is running.");try {// 模拟任务执行时间Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task " + taskId + " is completed.");});}// 关闭线程池executor.shutdown();}
}

上面的代码中,我们使用Executors.newFixedThreadPool(3)创建了一个固定大小为3的线程池。然后,我们通过executor.submit()方法向线程池提交了10个任务,每个任务都打印一个消息,休眠1秒钟,然后再打印完成消息。最后,我们调用executor.shutdown()方法关闭线程池。

当运行以上示例代码时,线程池会按照固定大小为3的线程数量依次执行任务,因为线程池中同时最多只能有3个线程在执行任务,其他任务会在任务队列中等待。

ThreadPoolExecutor

     

ThreadPoolExecutor是Java中用于管理线程池的类。它提供了一种可复用的线程池,可以管理和执行多个任务,从而提高程序的性能。

以下是ThreadPoolExecutor的构造函数及其参数的详细解释和说明:

  1. corePoolSize(核心线程数):线程池中同时执行的最大线程数。当提交一个任务到线程池时,如果线程池中的线程数小于corePoolSize,则创建一个新线程来执行任务。
  2. maximumPoolSize(最大线程数):线程池允许创建的最大线程数。当提交一个任务到线程池时,如果线程池中的线程数大于等于corePoolSize并且小于maximumPoolSize,则仅当工作队列已满时才会创建新线程。
  3. keepAliveTime(线程空闲时间):线程池中的线程空闲时间超过keepAliveTime时,如果当前线程池中的线程数大于corePoolSize,则该线程将会被销毁,直到线程池中的线程数不超过corePoolSize。
  4. unit(空闲时间单位):keepAliveTime的时间单位。
  5. workQueue(工作队列):用于保存等待执行的任务的队列。它可以是一个有界队列或者无界队列。
  6. threadFactory(线程工厂):用于创建线程的工厂类。可以自定义实现ThreadFactory接口来创建线程。
  7. handler(拒绝策略):当工作队列已满并且线程池中的线程数达到maximumPoolSize时,拒绝策略将决定如何处理新提交的任务。

下面是一个基本的ThreadPoolExecutor示例代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个线程池,核心线程数为2,最大线程数为4,空闲时间为10秒,使用有界队列ThreadPoolExecutor executor = new ThreadPoolExecutor(2,  // corePoolSize4,  // maximumPoolSize10, // keepAliveTimeTimeUnit.SECONDS, // unitnew ArrayBlockingQueue<>(10), // workQueueExecutors.defaultThreadFactory(), // threadFactorynew ThreadPoolExecutor.AbortPolicy() // handler);// 提交任务到线程池for (int i = 0; i < 10; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is running.");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task " + taskId + " is finished.");});}// 关闭线程池executor.shutdown();}
}

       在上述示例中,创建了一个具有2个核心线程、最大线程数为4、空闲时间为10秒的ThreadPoolExecutor。使用了有界队列ArrayBlockingQueue来存储任务。线程工厂使用了默认的线程工厂实现。拒绝策略采用了AbortPolicy,即当工作队列已满且线程池中的线程数达到最大线程数时,会抛出RejectedExecutionException异常。

        通过executor.submit()方法向线程池提交任务,任务会被添加到工作队列中等待执行。当线程池中的线程数小于corePoolSize时,会创建新线程来执行任务。当线程池中的线程数超过corePoolSize,并且工作队列已满时,会创建新线程来执行任务,直到线程池中的线程数达到maximumPoolSize。如果线程池中的线程数大于corePoolSize,并且空闲时间超过keepAliveTime时,空闲线程将被销毁,直到线程池中的线程数不超过corePoolSize。

        最后,通过executor.shutdown()方法关闭线程池。这将导致线程池不再接受新任务,并且等待所有已提交的任务执行完毕。

       

这篇关于线城池--Executor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901743

相关文章

Java线程池和Executor框架-面试与分析

线程池 什么是线程池?为什么要用线程池? 在Java并发框架中,线程池时使用最多的东西,几乎所有需要异步并发执行任务的程序都可以使用线程池。 使用线程池带来的好处: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的损耗提高响应时间。当任务到达时,任务可以不需要等待线程创建就可以立即执行提高线程的可管理性。线程是稀缺资源,如果无限创建,会降低系统的稳定性,使用线程可以进行统一分配

Executor 端长时容错详解

福利部分: 《大数据成神之路》大纲 大数据成神之路 《几百TJava和大数据资源下载》 资源下载 本系列内容适用范围:* 2018.11.02 update, Spark 2.4 全系列 √ (已发布:2.4.0)* 2018.02.28 update, Spark 2.3 全系列 √ (已发布:2.3.0 ~ 2.3.2)* 2017.07.11 update, Spark 2.

Callable Future Executor

一般通过继承Thread还有实现Runnable,都不可以有返回值,不可以声明检查异常。 Callable和Future,通过ExecutorService的submit方法执行Callable,并返回给Future,这里返回值只有一个,ExecutorService继承自Executor,通过使用Executor执行器来操作。 public class CallableAndFuture {

Spark Executor原理

Master发指令给Worker启动Executor。 Worker接收到Master发送来的指令通过ExecutorRunner启动另外一个进程来启动Executor。 CoarseGrainedExecutorBackend通过发送RegisterExecutor向Driver注册,Driver在Executor注册成功后会返回RegisterExecutor信息给CoarseGra

【并发】Java并发的四种风味:Thread、Executor、ForkJoin和Actor

本文由  ImportNew -  shenggordon 翻译自  Oleg Shelajev。欢迎加入 翻译小组。转载请见文末要求。 这篇文章讨论了Java应用中并行处理的多种方法。从自己管理Java线程,到各种更好几的解决方法,Executor服务、ForkJoin 框架以及计算中的Actor模型。 Java并发编程的4种风格:Threads,Executors,ForkJoin

# Executor源码分析 一看就会

Executor源码分析 一看就会 以前看的东西都写到有道云上,以后尝试写博客 参数 corePoolSize:核心运行的poolSize,也就是当超过这个范围的时候,就需要将新的Thread放入到等待队列中了; maximumPoolSize:一般你用不到,当大于了这个值就会将Thread由一个丢弃处理机制来处理, 但是当你发生:newFixedThreadPool的时候,coreP

Spring集成Quartz---Executor框架

ThreadPool衍生开来将还有一个特定的Executor框架。下文将详细展开讲。 1.Executor框架简介 1.1 概述 在程序运行过程中,创建和销毁线程需要一定的开销,因此如果我们为每一个任务创建一个新线程来执行,这些线程的创建及销毁将消耗大量的计算机资源。尤其是在线程任务不是特别重的情况下,系统的资源有可能极大的耗费在线程的创建与销毁上。 因此,我们

spark从入门到放弃五十五:设置executor 数量 和task 并行数

一.指定spark executor 数量的公式 在spark standalone 模式下无法直接指定每个worker 创建多少个executor 但是我们可以使用这样的方式。 executor 数量 = spark.cores.max/spark.executor.cores spark.cores.max 是指你的spark程序需要的总核数 spark.executor.cores 是指每

Query failed with error code 96 and error message 'Executor error during find command: OperationFail

Query failed with error code 96 and error message 'Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smal

线程池原理--执行器Executor

文章目录 线程池原理--执行器Executor继承体系Executor 线程池原理–总索引 线程池原理–执行器Executor 继承体系 Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command), ExecutorService:是一个比Executor使用更广泛的子