什么是java线程池

所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作。在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们...
什么是java线程池
找的资料,你看一下吧:
多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。

假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。

如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。
一个线程池包括以下四个基本组成部分:
1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。

线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个例子:

假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。2016-07-10
多线程是为了能够让计算机资源合理的分配,对于处理不同的任务创建不同的线程进行处理,但是计算机创建一个线程或者销毁一个线程所花费的也是比较昂贵的,有时候需要同时处理的事情比较多,就需要我们频繁的进行线程的创建和销毁,这样花费的时间也是比较多的。为了解决这一问题,我们就可以引用线程池的概念。
所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作。
在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们可以使用ThreadPoolExecutor来进行线程池的创建。
在ThreadPoolExecutor的构造方法中,有多个参数,可以配置不同的参数来进行优化。这个类的源码构造方法为:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)其中每个参数代表的意义分别为
corePoolSize : 线程池中的核心线程数量,当线程池中当前的线程数小于这个配置的时候,如果有一个新的任务到来,即使线程池中还存在空闲状态的线程,程序也会继续创建一个新的线程放进线程池当中
maximumPoolSize: 线程池中的线程最大数量
keepAliveTime:当线程池中的线程数量大于配置的核心线程数量(corePoolSize)的时候,如果当前有空闲的线程,则当这个空闲线程可以存在的时间,如果在keepAliveTime这个时间点内没有新的任务使用这个线程,那么这个线程将会结束,核心线程不会结束,但是如果配置了allowCoreThreadTimeOut = true,则当空闲时间超过keepAliveTime之后,线程也会被结束调,默认allowCoreThreadTimeOut = false,即表示默认情况下,核心线程会一直存在于线程池当中。
unit : 空闲线程保持连接时间(keepAliveTime)的时间单位
workQueue:阻塞的任务队列,用来保存等待需要执行的任务。
threadFactory :线程工厂,可以根据自己的需求去创建线程的对象,设置线程的名称,优先级等属性信息。
handler:当线程池中存在的线程数超过设置的最大值之后,新的任务就会被拒绝,可以自己定义一个拒绝的策略,当新任务被拒绝之后,就会使用hander方法进行处理。
在java中也提供了Executors工具类,在这个工具类中提供了多个创建线程池的静态方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor等。但是他们每个方法都是创建了ThreadPoolExecutor对象,不同的是,每个对象的初始 参数值不一样;2020-11-19
深入了解线程池的作用以及重要性

2021-05-22
mengvlog 阅读 45 次 更新于 2025-10-30 06:55:37 我来答关注问题0
  •  文暄生活科普 面试官问:SpringBoot中@Async默认线程池导致OOM如何解决?

    `SimpleAsyncTaskExecutor`线程池具备限流机制,通过`concurrencyLimit`属性控制。默认情况下,此属性值为-1,即不开启限流,导致在高并发情况下持续创建线程。源码分析揭示了限流机制实现,即当线程数超过`concurrencyLimit`时,当前线程会进入等待状态,直至线程数减至允许范围。实践验证 我们通过模拟测试验证了...

  •  赛玖久生活日记 java线程池面试题有哪些?java线程池常见面试题

    答案:是的,了解线程池的工作原理。当线程池中有任务需要执行时,线程池会进行以下判断和执行流程:如果线程数量没有超过核心线程数,线程池会新建线程来执行任务。如果线程池中的线程数量已经超过核心线程数,任务会被放入任务队列中排队等待执行。如果任务队列已满,并且线程池没有达到最大线程数,线程池...

  •  翡希信息咨询 程序员:平安Java岗面试耗尽了我毕生所学,想了想,还是去阿里吧

    2. JVM与底层优化 内存模型与GC机制:需深入理解堆内存分配、双亲委派模型、G1/CMS等垃圾回收器调优,属于Java性能优化高级范畴。类加载机制:考察对JVM启动流程、自定义类加载器的掌握,通常为资深工程师技能要求。3. 并发编程与线程池 Concurrent包类:如ConcurrentHashMap、CountDownLatch等工具的使用场景...

  •  翡希信息咨询 程序员:平安Java岗面试耗尽了我毕生所学,想了想,还是去阿里吧

    Jvm:要求掌握Jvm内存模型、类加载器、GC机制等,这是Java程序员必须深入理解的内容。Spring:涉及SpringBoot启动过程、注解、事件机制等,这是Spring框架的基础。数据结构:包括HashMap、ConcurrentHashMap、TreeMap等数据结构的使用和原理,以及B-tree、B+tree、红黑树等高级数据结构。并发与线程池:探讨了C...

  •  打拼生活日记本 java怎么避免频繁创建线程池

    1. **单例模式**:创建一个线程池的单例实例,在整个应用程序中复用这个线程池。这样可以确保在需要执行任务时,直接使用已有的线程池,而不是每次都重新创建。例如:```javapublic class ThreadPoolSingleton { private static final ExecutorService threadPool = Executors.newFixedThreadPool(10);pr...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部