【线程池】概述及创建

这篇具有很好参考价值的文章主要介绍了【线程池】概述及创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程池

1.什么是线程池?

线程池就是一个可以复用线程的技术

2.不使用线程池的问题

用户每发起一个请求,后台就需要一个新的线程来处理,下次新的任务来了肯定又要创建新线程处理的,而创建新线程的开销是很大的,并且请求过多时,肯定会产生大量的线程出来,这样会严重影响系统的性能

3.创建线程池

(1)JDK5.0起提供了代表线程池的接口:ExecutorService

(2)得到线程池对象

  • 方式一:使用ExecutorService的实现类ThreadPoolExecutor创建一个线程池对象

    ①ThreadPoolExecutor构造器:

    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
    BlockingQueue< Runnable> workQueue, ThreadFactory threadFactory,
    RejectedExecutionHandler handler)

    • 参数一:corePoolSize : 指定线程池的核心线程的数量
    • 参数二:lmaximumPoolSize:指定线程池的最大线程数量
    • 参数三:keepAliveTime :指定临时线程的存活时间
    • 参数四:unit:指定临时线程存活的时间单位(秒、分、时、天)
    • 参数五:workQueue:指定线程池的任务队列
    • 参数六:threadFactory:指定线程池的线程工厂
    • 参数七:handler:指定线程池的任务拒绝策略(线程都在忙,任务队列也满了的时候,新任务来了该怎么处理

    ②线程池的注意事项

    临时线程什么时候创建:新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程

    什么时候会开始拒绝新任务:核心线程和临时线程都在忙,任务队列也满了,已经达到最大线程数量,新的任务过来的时候才会开始拒绝任务

    public class Demo {
        public static void main(String[] args) {
            ThreadPoolExecutor pool = new ThreadPoolExecutor(
                    3, //核心线程数量
                    5, //最大线程数量
                    30, //临时线程存活时间
                    TimeUnit.SECONDS, //时间单位
                    new ArrayBlockingQueue<>(4), //任务队列
                    Executors.defaultThreadFactory(), //线程工厂
                    new ThreadPoolExecutor.AbortPolicy() //默认拒绝策略(拒绝服务,并且抛出异常)
            );
        }
    }
    /*线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险
    Executors返回的线程池对象的弊端如下
        FixedThreadPool、SingleThreadExecutor任务队列太长(Integer.MAX_VALUE)可能堆积大量请求,导致OOM
        CachedThreadPool、ScheduledThreadPool最大线程数量太大(Integer.MAX_VALUE)可能堆积大量请求,导致OOM*/
    

    ③新任务拒绝策略

    策略 详解
    ThreadPoolExecutor.AbortPolicy 丢弃任务并抛出RejectedExecutionException异常。是默认的策略
    ThreadPoolExecutor.DiscardPolicy 丢弃任务,但是不抛出异常 这是不推荐的做法
    ThreadPoolExecutor.DiscardOldestPolicy 抛弃队列中等待最久的任务 然后把当前任务加入队列中
    ThreadPoolExecutor.CallerRunsPolicy 由主线程负责调用任务的run()方法从而绕过线程池直接执行
  • 方式二:使用Executors(线程池工具类)调用方法返回不同特点的线程池对象

    方法名称 说明
    public static ExecutorService newFixedThreadPool(int nThreads) 创建固定线程数量的线程池,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程替代它。
    public static ExecutorService newSingleThreadExecutor() 创建只有一个线程的线程池对象,如果该线程出现异常而结束,那么线程池会补充一个新线程。
    public static ExecutorService newCachedThreadPool() 线程数量随着任务增加而增加,如果线程任务执行完毕且空闲了60s则会被回收掉。
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 创建一个线程池,可以实现在给定的延迟后运行任务,或者定期执行任务。

    注意:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式更加明确线程池的运行规则,规避资源耗尽的风险。Executors返回的线程池对象的弊端如下
    FixedThreadPool、SingleThreadExecutor任务队列太长(Integer.MAX_VALUE)可能堆积大量请求,导致OOM(内存溢出)
    CachedThreadPool、ScheduledThreadPool最大线程数量太大(Integer.MAX_VALUE)可能堆积大量请求,导致OOM
    文章来源地址https://www.toymoban.com/news/detail-698411.html

到了这里,关于【线程池】概述及创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java多线程 - Java创建线程的4种方式

    1. Java创建线程有哪几种方式? 一个线程在Java中使用一个Thread实例来描述。Thread类是Java语言的一个重要的基础类,位于java.lang包中。Thread类有不少非常重要的属性和方法,用于存储和操作线程的描述信息。 Thread类的构造方法: 1.1 线程创建方法一:继承Thread类创建线程类 (

    2023年04月08日
    浏览(41)
  • 【Java 基础篇】Java多线程编程详解:线程创建、同步、线程池与性能优化

    Java是一门强大的编程语言,其中最引人注目的特性之一是多线程支持。多线程允许我们在同一程序中同时执行多个任务,这大大提高了应用程序的性能和响应能力。本文将深入介绍Java线程的基础知识,无论您是初学者还是有一些经验的开发人员,都将从中获益。 在计算机科

    2024年02月07日
    浏览(57)
  • Java 进阶(7) 创建线程

    1. 定义Thread类的⼦类,并重写该类的run()⽅法,该run()⽅法的⽅法体就代表了线程需要完成的任务,因此把run()⽅法称为线程执⾏体。 2. 创建Thread⼦类的实例,即创建了线程对象 3. 调⽤线程对象的start()⽅法来启动该线程 示例: 测试: 1. 定义Runnable接⼝的实现类,并重写该接⼝

    2023年04月16日
    浏览(46)
  • 探索 Java 线程的创建

    by emanjusaka from ​ https://www.emanjusaka.top/2023/09/java-thread-create 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址。 在并发编程中我们为啥一般选用创建多个线程去处理任务而不是创建多个进程呢?这是因为线程之间切换的开销小,适用于一些要求同时进行并且又要

    2024年02月09日
    浏览(36)
  • Java 创建线程的方法

    🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,计算机系列(火速更新中) 💭 格言:种一棵树最好的时间是十年前,其次是现在 🏡动动小手,点个关注不迷路,感

    2024年02月07日
    浏览(41)
  • 【Java入门】Java的语言概述

    前言 📕作者简介: 热爱跑步的恒川 ,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Java入门篇系列,该专栏主要讲解:什么是java、java的数据类型与变量、运算符、程序的逻辑控制、方法的使用、数组的定义与使、类和对象、继承和

    2024年02月05日
    浏览(37)
  • 【Linux】C语言中多线程的创建、退出、回收、分离

    线程是轻量级的进程(LWP:light weight process),在 Linux 环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解, 进程是资源分配的最小单位,线程是操

    2024年02月09日
    浏览(43)
  • Java多线程(1)---多线程认识、四种创建方式以及线程状态

    目录 前言 一.Java的多线程 1.1多线程的认识  1.2Java多线程的创建方式 1.3Java多线程的生命周期 1.4Java多线程的执行机制 二.创建多线程的四种方式 2.1继承Thread类 ⭐创建线程  ⭐Thread的构造方法和常见属性  2.2.实现Runnable接口 ⭐创建线程 ⭐使用lambda表达式创建 2.3实现Callable接口

    2024年02月14日
    浏览(43)
  • 一、Java语言概述

    是 SUN (Stanford University Network,斯坦福大学网络公司 ) 1995年 推出的一门高级编程语言。 是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在 Web浏览器 中运行。这些Java程序被称为 Java小程序 (applet),内嵌在HTML代码中。 伴随着互联网的迅猛发展,以及

    2024年02月04日
    浏览(43)
  • java语言概述

    软件,即一系列按照特定顺序组织的计算机数据和指令的集合。有系统软件和应用软件之分。 图形化界面(Graphical User Interface GUI) :这种方式简单直观,使用者易于接受,容易上手操作。 命令行方式(Command Line Interface CLI) :需要有一个控制台,输入特定的指令,让计算机完成

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包