首页 > 其他分享 >线程池

线程池

时间:2023-05-22 15:56:02浏览次数:30  
标签:队列 创建 任务 线程 pool ThreadPoolExecutor

线程池:
JDK的线程池有:ThreadPoolExecutor,ScheduledThreadPoolExecutor(带任务调度)
ThreadPoolExecutor构造方法参数说明:ThreadPoolExecutor(核心线程数,最大线程数,救急线程存活时间,存活时间单位,阻塞队列),
救急线程数=最大线程数-核心线程数,当任务数多于线程数时,如果有救急线程,就会创建救急线程,如果没有就会进入阻塞队列等待.
创建线程池一般不用构造方法,用JDK提供的工厂方法,这些工厂方法也是调构造方法创建的线程池,比如
1 创建固定大小的线程池:
ExecutorService pool = Executors.newFixedThreadPool(2);固定大小线程池适合任务数固定的情况
底层实现:return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
1.如果线程数量没有达到“固定数量”,则每次提交一个任务池内就创建一个新的线程,直到到达固定的数量
2.线程池的大小一旦达到“固定数量”就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3.如果池中的所有线程均在繁忙状态,对于新任务会进入阻塞队列中(无界的阻塞队列)。
使用场景:需要任务长期执行的场景。“固定数量的线程池”的线程数能够比较稳定保证一个数,能够避免频繁回收线程和创建线程,故适用于处理 CPU 密集型的任务,在 CPU 被工作线程长时间使用的情况下,能确保尽可能少的分配线程。 弊端:内部使用无界队列来存放排队任务,当大量任务超过线程池最大容量需要处理时,队列无线增大,使服务器资源迅速耗尽。

2 创建单一线程的线程池:ExecutorService pool = Executors.newSingleThreadExecutor(),这种线程池和自己创建单线程的区别:
某一个任务报错时单一线程的线程池会再创建一个线程继续执行下面的任务,单线程需要自己处理异常才会向下执行.
单一线程池的底层创建代码:
(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
1.单线程化的线程池中的任务,是按照提交的次序,顺序执行的
2.池中的唯一线程的存活时间是无限的
3.当池中的唯一线程正繁忙时,新提交的任务实例会进入内部的阻塞队列中,并且其阻塞队列是无界的。
总体来说,单线程化的线程池所适用的场景是:任务按照提交次序,一个任务一个任务逐个执行的场景。

3 newCachedThreadPool 创建“可缓存线程池”
ExecutorService pool = Executors.newCachedThreadPool();
底层实现:return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,newSynchronousQueue<Runnable>());
1.在接收新的异步任务 target 执行目标实例时,如果池内所有线程繁忙,此线程池会添加新线程来处理任务。
2.此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说 JVM)能够创建的最大线程大小。
3.如果部分线程空闲,也就是存量线程的数量超过了处理任务数量,那么就会回收空闲(60 秒不执行任务)线程。
适用场景:需要快速处理突发性强、耗时较短的任务场景,如 Netty 的NIO 处理场景、REST API 接口的瞬时削峰场景。“可缓存线程池”的线程数量不固定,只要有空闲线程就会被回收;接收到的新异步任务执行目标,查看是否有线程处于空闲状态,如果没有就直接创建新的线程。 弊端:线程池没有最大线程数量限制,如果大量的异步任务执行目标实例同时提交,可能导致创线程过多会而导致资源耗尽。


线程池执行任务方法: pool.execute(Runnable接口)无返回值,pool.submit(Runnable接口)有返回值
线程池里核心线程是一直存活的,没有任务执行程序也不会结束,想要结束线程池需要调用pool.shutDown方法,调用这个方法后
正在执行的线程会继续执行完,阻塞队列里的任务也会执行完,但不会接受新的任务

标签:队列,创建,任务,线程,pool,ThreadPoolExecutor
From: https://www.cnblogs.com/1--2/p/17420826.html

相关文章

  • < Python全景系列-5 > 解锁Python并发编程:多线程和多进程的神秘面纱揭晓
    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。这是本系列的第五篇,我们将深入探讨Python中的......
  • 多线程-sychronized锁膨胀
    sychronized什么是cascas的定义:在操作系统中,CAS通常代表“CompareAndSwap”,它是一种原子操作,用于解决并发访问的问题。具体地说,CAS操作会比较并交换一个内存位置的值,只有当内存位置的值与期望的值相等时,才会将新值写入该位置。如果内存位置的值与期望的值不相等,则说明这个内存位......
  • python的守护线程(简介、作用及代码实例)
    转载:(14条消息)python的守护线程(简介、作用及代码实例)_python守护线程的作用_HXH.py的博客-CSDN博客python守护线程简介守护线程的理解:如果当前python线程是守护线程,那么意味着这个线程是“不重要”的,“不重要”意味着如果他的主进程结束了但该守护线程没有运行完,守护进程就会被......
  • 网络编辑的使用和知识点,进程线程之间实现交互
    软件开放的框架c/s架构c就是Client客户端就是要去请求数据的s就是Server服务端就是给客服端根据客户的要求提供数据的服务端的必备条件时刻提供服务等待客服端的访问有一个固定的地址能够接受多个服务端的请求(高并发)B/s架构B就是Browser就是一个浏览器充当所有服务端......
  • 线程的三个辅助类
    Semaphore1packagecom.huo.HelperClass;23importjava.util.concurrent.Semaphore;4importjava.util.concurrent.TimeUnit;56/**7*@version1.08*@Author作者名9*@Date2022/9/1311:1810*/11publicclassSemaphoreDemo{12pub......
  • nodejs多线程,真正的非阻塞
    干货:收藏:http://cnodejs.org/topic/518b679763e9f8a5424406e9node从他推出至今,充满赞美和饱受诟病的都是其单线程模型,所有的任务都在一个线程中完成(I/O等例外),优势的地方自然是免去了频繁切换线程的开销,以及减少资源互抢的问题等等,但是当nodejs面对cpu密集型模型的时候就力不从心了......
  • controller是单例模式还是多例模式?spring默认的是单例模式,那么如何保证线程安全
    controller是单例模式还是多例模式在Java中,Controller既可以是单例模式,也可以是多例模式,这取决于具体的实现方式。在单例模式中,Controller只会被实例化一次,多个线程共享同一个实例。这样可以节约系统资源,提高系统性能。但是在多线程环境下,如果不加以保护,可能会出现线程安全的问......
  • Java-Day-23( 线程二:线程终止 + 常用方法 + 用户线程 + 守护线程 + 线程生命周期 + Syn
    Java-Day-23线程终止setLoop()基本说明当线程完成任务后,会自动退出还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式练习使用publicclasstest1{publicstaticvoidmain(String[]args)throwsInterruptedException{Tt1=newT();......
  • Java中的并发编程:线程池的使用与优化
    在Java编程中,处理并发任务是一项常见而重要的任务。合理地管理线程可以提高程序的性能和响应性。本文将介绍Java中线程池的使用和优化技巧,帮助开发者更好地处理并发编程的挑战。1.线程池的基本概念线程池是一种用于管理线程的技术,它通过预先创建一组线程,并将任务分配给这些线程来......
  • NET 高级编程知识--多线程async/await
    NET高级编程知识一.多线程async/awaitasync:的价值1.降低了线程的数量;2.降低了cpu的负载;3.asnync/await提高了吞吐,只负责发命令,然后就忙别的事去了,不需要等待,事完成前不浪费资源,完成后在来线程处理,还能复用线程,不开新线程。asnyn:并发不高,线程较多,cpu开销不大,使用了DAM异......