首页 > 编程语言 >Java线程池基础介绍

Java线程池基础介绍

时间:2023-07-03 14:44:32浏览次数:34  
标签:Java 策略 队列 创建 介绍 任务 线程 执行

一、线程池的优点

  1、线程池能够复用已经创建了的线程来执行任务,从而降低了频繁创建和销毁线程所带来的资源消耗;

  2、任务创建完成时,不必等待线程的创建,能够立即执行,提高了任务响应的速度。

 

二、创建线程池的七大核心参数

  1、corePoorSize 核心线程数

     线程池中长期存活的线程数量。一般情况下,当线程处于空闲状态时也不会被销毁。

  2、maximumPoorSize 最大线程数

     线程池中允许创建的最大线程数量。当线程池队列满后,能够创建的最大线程数量(核心线程总数量 + 非核心线程总数量)。

  3、keepAliveTime 存活时间

     非核心线程的最大空闲时间。当非核心线程处于空闲状态的时长到达这个时间,就会被销毁。

  4、TimeUnit 时间单位

     存活时间的时间单位。

  5、workQueue 线程池工作队列

     存放工作任务的阻塞队列。当有任务被提交时,若没有线程能够处理,该任务就会被放到队尾,等待线程执行。

  6、threadFactory 线程工厂

     创建一个新的线程时,用到的线程工程。可以用来设置线程名等线程参数。

  7、handler 拒绝策略

     当线程池中的工作线程数量达到了最大线程数量,并且工作队列也容量也满了,此时有任务提交进来时,需要做的处理。

 

三、线程池的执行流程

 如图,线程池的执行策略可以分为三个步骤:

  1、当任务提交时,若此时的工作线程数小于核心线程数,则会创建一个线程来执行任务;

  2、当核心线程数已满时,如果此时阻塞队列没有满,则将任务放入到阻塞队列中,等待线程执行;

  3、若核心线程数和阻塞队列都已满时,会去判断当前线程数是否达到最大线程数,没有达到就会创建一个非核心线程来执行任务,达到就执行拒绝策略。

 

四、常用的四种工作队列

  1、ArrayBlockingQueue 基于数组的有界阻塞队列

    当核心线程数已满,会将新的任务放到队列当中,并按照FIFO的顺序等待线程调度。若队列中的任务达到给定的数值,则会启动新的线程去执行任务,若当前线程数量到达最大线程数量,则拒绝执行任务。

  2、LinkedBlockingQuene 基于链表的无界阻塞队列

    也是按照FIFO的,容量为Integer类型的最大值,所以近似于无界。所以maxPoolSize此时就是无效的,因为队列无界,能够不断添加任务,导致不会去创建非核心线程,线程数量最多等于核心线程数量,达不到最大线程数量。

  3、SynchronousQuene 不缓存任务的阻塞队列

    相当于没有队列,当当前线程数达到corePoolSize时,直接创建非核心线程执行任务,当当前线程数到达maxPoolSize后,则拒绝任务。

  4、PriorityBlockingQueue 具有优先级的无界阻塞队列

    默认情况下,元素采用自然顺序升序排列,也可以自定义类,然后实现compareTo()方法来指定元素排序规则。

 

五、常用的四种拒绝策略

  1、AbortPolicy

    中止策略,直接抛出 RejectedExecutionException 错误。线程池默认使用的策略。

    编写一个简单的执行deno:

public static void main(String[] args) {
        // 创建一个线程池
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 5, 3L, TimeUnit.MINUTES, new ArrayBlockingQueue<>(1), new ThreadPoolExecutor.AbortPolicy() );

        for (int i = 0; i < 100; i++) {
            int finalI = i;
            poolExecutor.execute(() -> {
                try {
                    Thread.sleep(1000);
                    System.out.println("[" + Thread.currentThread().getName() + "]:" + finalI + "同学完成");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        poolExecutor.shutdown();
    }

     执行结果:达到最大线程数后,直接抛出错误

 

  2、CallerRunsPolicy 

    调用者执行策略,将任务返回给提交该任务的线程执行。

    执行demo不变,将执行策略换为CallerRunsPolicy,运行结果:

     可见,因为我们的main线程提交任务给线程池后,线程池队列及线程数量都已满,便将执行的任务返回给main线程,由main线程执行。

  3、DiscardPolicy

    丢弃策略,将该任务丢弃,且不抛出异常。

    执行demo不变,将执行策略换为DiscardPolicy,运行结果:

     达到最大线程数后,不执行提交的任务。

  4、DiscardOldestPolicy

    丢弃最老的策略,丢弃队列最前面的任务。

    执行demo不变,将执行策略换为DiscardOldestPolicy,运行结果:

     0~5号任务执行过程中,不断有新的任务提交,最后执行到了第99号任务,因为前面的不断被丢弃,99最后被放入队列并被线程执行。

标签:Java,策略,队列,创建,介绍,任务,线程,执行
From: https://www.cnblogs.com/hehuahua/p/17511344.html

相关文章

  • JavaScript 中 object 的几个方法:entries,values,keys 对比
    在JavaScript中,对象(Object)是一种无序的键值对集合。以下是entries,values和keys这三个对象方法的比较: entries()方法:返回一个包含对象的键值对的数组。每个键值对都是一个数组,包含两个元素,第一个元素是键名,第二个元素是对应的值。1constobj={a:1,b:2,c:3};2conso......
  • JAVA获取字符串内的括号对(支持多层级);获取括号对的内容;按指定规则返回括号对位置;
    先看结果:处理字符串 "这个是一条测试用的字符串[(5(4(3[(1)(2)]))(7))][(6)]"结果  解决思路:参考正则表达式里面出入站部分 代码实现如下:方法调用“: Stringtest="这个是一条测试用的字符串[(5(4(3[(1)(2)]))(7))][(6)]";LinkedHashMap<Inte......
  • 41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
    已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring多数Boot中使用多数据源做准备。从Spring3.0开始,增加了一种新的途径来配置BeanDefinition,这就是通过JavaCode配置BeanDefinition。      与XML和Annotation两种配置方式不同点在于:      ......
  • jsjiami.v6加密混淆逆向分析介绍
    在互联网的不断发展的今天,网站的安全性越来越受到重视。JS混淆加密技术是一种常用的保护网站安全的手段。jsjiami.v6是一款常用的JS混淆加密工具,下面我们来详细了解一下。首先,我们来看一下一个使用jsjiami.v6进行混淆加密的案例代码:eval(function(p,a,c,k,e,r){e=function(c){re......
  • 郑州Java面试题
    常见题库https://github.com/cosen1024/Java-Interviewhttps://github.com/whx123/JavaHomehttps://github.com/lvminghui/Java-Noteshttps://github.com/cosen1024/Java-Interview==和equals区别==基本类型比较的是值,对象类型比较的是地址,equals默认情况下也是比较地址......
  • JAVA生成xml文件格式
    publicboolean A(参数1,……){Documentdocument=DocumentHelper.createDocument();Namespacena=Namespace.get("");Strings=null;na=new Namespace(xxxxxxxxxxxxxxxxxxxxx);//命名空间Elementroot=document.addElement(newQName(“A......
  • java 相对路径问题 和绝对路径
    小例:java代码:都可以成功Filefile=newFile("./xml/a.properties");Filefile=newFile("xml/a.properties");下面就会出错Filefile=newFile("/xml/a.properties"); 总结:.为当前目录,即工程名所在文件夹  下面的当前路径都是你的工程目录Filefile=newFile("./......
  • 关于Java RDP协议实现远程桌面连接的开源项目properjavardp
    最近想学一下在Android平台上实现RDP协议远程连接PC,于是在网上找这方面的资料,发现了一个开源的JavaRDP项目,很不错,拿出来和大家分享一下。关于properjavardp的一些说明,可以到这里看看:http://properjavardp.sourceforge.net/ 。1、首先到http://sourceforge.net/projects/properjav......
  • JavaCV的摄像头实战之十三:年龄检测
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《JavaCV的摄像头实战》系列的第十三篇,前文《JavaCV的摄像头实战之十二:性别检测》中,借助训练好的卷积神经网络模型开发出了识别性别的应用,今天在前文基础......
  • HTML+CSS+JavaScript基础
    1、HTML(HypertextMarkupLanguage,超文本标记语言),用来向浏览器说明内容的结构、2、DOM(DocumentObjectModel,文档对象模型)指的是HTML标签的层次结构。每一对HTML标签(有的时候是一个标签)都是一个元素。3、CSS(CascadingStyleSheets,层叠样式表),控制DOM元素的视觉外观......