首页 > 其他分享 >ThreadPool

ThreadPool

时间:2022-12-07 21:47:30浏览次数:41  
标签:nThreads 队列 ThreadPool 线程 new ExecutorService public

Java线程池

Java接口

public class ThreadPoolTest {
    public static void main(String[] args) {
        ExecutorService e1 = Executors.newSingleThreadPool();
        ExecutorService e2 = Executors.newCachedThreadPool();
        ExecutorService e3 = Executors.newFixedThreadPool();
        ExecutorService e4 = Executors.newScheduledThreadPool(10);
    }
}

本质上前三个最终都调用了ThreadPoolExecutor,知识传进去的参数不一样
eg

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

参数分别为核心线程数,最大线程数,线程存活时间,时间单位,阻塞队列

基本的流程为,先创建核心线程接受请求,在数量达到最大值后请求进入阻塞队列,阻塞队列如果满了,就创建普通线程执行后续请求,注意是后续请求而不是先执行队列里面的。如果线程总数达到了maximumPoolSize,并且所有线程都在工作中,如果还有新的请求就会抛出异常。

上面大致是最坏情况,一般来说,在队列满之前核心线程或者可能就执行完请求了,那么根据keepAliveTime参数,如果普通线程在这段时间内没有接受到请求,那么这个普通线程就会被GC。注意核心线程不会被回收。

cachedThreadPool

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

核心线程数0,总线程数最大值,同步队列大小为0
所以一开始任务进来后因为核心线程已经达到了最大值0,所以要进入队列,但队列的大小也为0,所以会创建普通线程执行任务,知道线程数达到Integer.MAX_VALUE后还有新任务进入,才会抛异常。没事情干的线程60s后被回收。(60s是否合理?线程数量太大会不会OOM?)

fixedThreadPool

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

核心线程数=最大线程数,没事干的普通线程会立刻销毁,但是因为永远不会有普通线程,所以线程的数量是固定的,没有线程会被销毁,此外队列是无限大的。(无穷队列是否会OOM?)

标签:nThreads,队列,ThreadPool,线程,new,ExecutorService,public
From: https://www.cnblogs.com/antidogmatist/p/16964620.html

相关文章

  • 线程池ThreadPoolTaskExecutor的同步及异步使用
    参考信息本人参考的是这一篇,描述方面比本人好得多:springboot线程池的使用和扩展VisiableThreadPoolTaskExecutor背景:简略记一下,笔记:目标是想在springboot服务下,自......
  • JUC2 ThreadPool
    1.线程池架构JDK提供两种线程池类型,一种是ThreadPoolExcutor,一种是ForkJoinPool.本节课重点讲解ThreadPoolExcutor。线程池做的工作主要是控制运行的线程的数量,处理过程......
  • java15源码-ThreadPoolExecutor
    一Executors工具类创建ThreadPoolExecutorSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolnewSingleThreadScheduledExecuto......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    (目录)一、说明RejectedExecutionHandler当线程池已经被关闭,或者任务数超过maximumPoolSize+workQueue时执行拒绝策略ThreadPoolExecutor.AbortPolicy默认拒绝策略,丢......
  • python 线程池 ThreadPoolExecutor
    从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor(线程池)和ProcessPoolExecutor(进程池)两个类。相比threading等模块,该模......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.AbortPolicy​​​​2.DiscardPolicy​​​​3.DiscardOldestPolicy​​​​4.CallerRunsPolicy​​​​5.自......
  • 性能爆表:利用ThreadPoolTaskExecutor批量插入百万级数据实测!
    来源:azdebug.blog.csdn.net/article/details/103697108前言开发目的:提高百万级数据插入效率。采取方案:利用ThreadPoolTaskExecutor多线程批量插入。采用技术:spring......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • ThreadPoolExecutor 源码解析
    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。合理地使用线程池能够带来3个好处:降低资源消耗。通过重复利用已创建的线......