本文主要是介绍线城池--Executor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Executors
线程池(ThreadPool)是一种用来管理线程的机制,它维护着一个线程队列,用于执行任务。线程池提供了一种限制线程数量和重用线程的方式,可以更加有效地利用系统资源,提高系统的性能。
Java中的线程池由java.util.concurrent.Executor框架提供,其中一个实现是线程池Executor。Executor框架中的线程池主要由以下三个部分组成:
- 任务队列(Task Queue):存放等待执行的任务。
- 工作线程(Worker Threads):执行任务的线程。
- 线程池管理器(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的构造函数及其参数的详细解释和说明:
- corePoolSize(核心线程数):线程池中同时执行的最大线程数。当提交一个任务到线程池时,如果线程池中的线程数小于corePoolSize,则创建一个新线程来执行任务。
- maximumPoolSize(最大线程数):线程池允许创建的最大线程数。当提交一个任务到线程池时,如果线程池中的线程数大于等于corePoolSize并且小于maximumPoolSize,则仅当工作队列已满时才会创建新线程。
- keepAliveTime(线程空闲时间):线程池中的线程空闲时间超过keepAliveTime时,如果当前线程池中的线程数大于corePoolSize,则该线程将会被销毁,直到线程池中的线程数不超过corePoolSize。
- unit(空闲时间单位):keepAliveTime的时间单位。
- workQueue(工作队列):用于保存等待执行的任务的队列。它可以是一个有界队列或者无界队列。
- threadFactory(线程工厂):用于创建线程的工厂类。可以自定义实现ThreadFactory接口来创建线程。
- 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!