ThreadPoolExecutor:线程池不允许使用Executors创建

合理利用线程池能够带来三个好处

  • 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  • 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌

线程池的主要工作流程


从上图我们可以看出,当提交一个新任务到线程池时,线程池的处理流程如下:

  •  首先线程池判断基本线程池是否已满?没满,创建一个工作线程来执行任务。满了,则进入下个流程。
  • 其次线程池判断工作队列是否已满?没满,则将新提交的任务存储在工作队列里。满了,则进入下个流程。
  • 最后线程池判断整个线程池是否已满?没满,则创建一个新的工作线程来执行任务,满了,则交给饱和策略来处理这个任务。


线程池的创建

我们可以通过ThreadPoolExecutor来创建一个线程池。


new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, milliseconds,runnableTaskQueue, threadFactory,handler);

创建一个线程池需要输入几个参数:

corePoolSize - 线程池核心池的大小。
maximumPoolSize - 线程池的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 的时间单位。
workQueue - 用来储存等待执行任务的队列。
threadFactory - 线程工厂。
handler - 拒绝策略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是用 JavaThreadPoolExecutor 创建线程池的示例代码: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; public class ThreadPoolExample { public static void main(String[] args) { int corePoolSize = 2; int maximumPoolSize = 4; long keepAliveTime = 10; ExecutorService executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, java.util.concurrent.TimeUnit.SECONDS, new java.util.concurrent.LinkedBlockingQueue<Runnable>() ); // 提交任务 for (int i = 0; i < 10; i++) { executor.execute(new Task(i)); } // 关闭线程池 executor.shutdown(); } static class Task implements Runnable { private int id; public Task(int id) { this.id = id; } public void run() { System.out.println("Task " + id + " is running."); } } } ``` 在这个例子中,我们使用 ThreadPoolExecutor 创建了一个线程池。它的参数包括: - corePoolSize线程池中核心线程的数量; - maximumPoolSize线程池中最大线程数; - keepAliveTime:线程池中非核心线程的超时时间; - TimeUnit:超时时间的单位; - BlockingQueue:用于缓存等待执行的任务的队列。 我们还定义了一个 Task 类来模拟需要执行的任务。在主函数中,我们提交了 10 个任务给线程池,并在任务执行结束后关闭了线程池。 ### 回答2: 使用java中的ThreadPoolExecutor类可以很方便地创建线程池。首先,我们需要导入java.util.concurrent包,在代码中创建ThreadPoolExecutor对象。 ThreadPoolExecutor类的构造函数有多个参数,其中最重要的是corePoolSizemaximumPoolSize、keepAliveTime、unit、workQueue和threadFactory。corePoolSize指定了线程池中保留的线程数,maximumPoolSize指定了线程池允许的最大线程数。keepAliveTime和unit用于指定超过corePoolSize数量的空闲线程在被终止之前等待新任务的最长时间。workQueue用于存储等待执行的任务。threadFactory用于创建新线程。 下面是一个简单的示例代码: ``` import java.util.concurrent.*; public class ThreadPoolExample { public static void main(String[] args) { int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 1; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10); ThreadFactory threadFactory = Executors.defaultThreadFactory(); ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); // 添加任务到线程池 for (int i = 0; i < 20; i++) { executor.execute(new Task(i)); } // 终止线程池 executor.shutdown(); } } class Task implements Runnable { private int taskId; public Task(int taskId) { this.taskId = taskId; } @Override public void run() { System.out.println("Task " + taskId + " is running."); } } ``` 在上面的示例中,我们创建了一个ThreadPoolExecutor对象executor,它使用corePoolSize=5、maximumPoolSize=10、keepAliveTime=1秒、单位TimeUnit.SECONDS的时间单位、workQueue容量为10的ArrayBlockingQueue以及默认的线程工厂。然后,我们向线程池中添加20个任务,每个任务都会打印任务的ID。最后,我们通过executor.shutdown()方法来终止线程池。 通过使用ThreadPoolExecutor类,我们可以方便地创建和管理线程池,从而实现任务的并发执行。 ### 回答3: Java中的ThreadPoolExecutor是一个用于创建和管理线程池的类。 首先,我们需要导入java.util.concurrent包中的ThreadPoolExecutor类。接下来,我们可以使用ThreadPoolExecutor的构造函数来创建一个线程池对象。构造函数接受一些参数,如核心线程数、最大线程数、线程等待时间等。 例如,我们可以使用以下代码创建一个线程池对象: ``` ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); ``` 在上面的代码中,我们创建了一个核心线程数为5,最大线程数为10的线程池。执行的任务将被放入一个无界队列LinkedBlockingQueue中,并且线程空闲时等待的时间为60秒。 接下来,我们可以通过调用execute()方法来提交任务给线程池执行。例如,我们可以创建一个实现了Runnable接口的任务,并将其提交给线程池执行,如下所示: ``` Runnable task = new MyTask(); executor.execute(task); ``` 上述代码中,MyTask是一个实现了Runnable接口的自定义任务类。我们创建了一个MyTask对象,并使用execute()方法将其提交给线程池执行。 最后,当不再需要使用线程池时,我们可以调用shutdown()方法来关闭线程池。例如: ``` executor.shutdown(); ``` 在上述代码中,executor.shutdown()方法将使线程池停止接受新的任务,并等待所有已提交的任务执行完成后,关闭线程池。 通过使用ThreadPoolExecutor类,我们可以方便地创建和管理线程池,提高多线程程序的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值