首页 > 编程语言 >Java线程池

Java线程池

时间:2023-03-13 22:01:42浏览次数:28  
标签:... Java 队列 创建 阻塞 任务 线程

线程池的目的是通过对线程的管理,让多线程程序中的多线程便捷开发、高效运行。

线程池的存在的意义

  • 让线程变得可重用,减小线程创建和销毁带来的消耗
  • 线程池中保留的可用线程,无需创建过程即可立即执行,提高响应速度
  • 方便线程并发数的管控,避免创建过多的线程,从而导致占用过多资源。
  • 提供定时、定期以及可控线程数等功能的线程池。

基础原理

  • 将线程进行管理
  • 以空间换时间

应用

        ExecutorService service= Executors.newCachedThreadPool();
        service.submit(()->{
            System.out.println(Thread.currentThread().getName());
        });

工作流程

调用shutdown()或者shutdownNow()关闭线程池

  • shutdown()
    • 将线程池的状态改为SHUTDOWN,不再继续网线程池中添加任务,否则会抛异常。
    • 线程池直到添加到线程池中的任务已经处理完毕才退出。
  • shutdownNow()
    • 线程池状态改为STOP,不再继续添加新的任务。
    • 终止正在执行的线程。
    • 调用Thread.interrup(),试图停止所有正在执行的线程。

四种线程池

这四类常用的线程池,是预置的。

  • newCachedThreadPool:可缓存的无界线程池。线程闲置60s后,将被回收。
  • newFixedThreadPool:指定线程数的线程池,超出的线程将会在LinkedBlockQueue阻塞队列中等待。
  • newSingleThreadExecutor:单线程执行器,保证所有的任务以FIFO、优先级等顺序执行。
  • newScheduledThreadPool:指定长度线程池,支持定时、周期任务的执行。

线程池的实现原理

Executors是个工厂方法,用于创建线程池,是通过配置ThreadPoolExecutor来构建线程池。

public class Executors {
	public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
	...newFixedThreadPool(...);
	...newSingleThreadExecutor(...);
	...newScheduledThreadPool(...);
}
  • corePoolSize 核心线程池大小
    • 提交任务时,线程数<corePoolSize,即使存在空闲线程,也创建线程。
  • maximumPoolSize 线程池最多线程数
    • 当任务队列满了,并且线程数<maximumPoolSize ,则创建新线程。无界队列忽视该参数。
  • keepAliveTime,unit 线程存货保持时间,时间单位
    • 线程数>corePoolSize的时候,线程的空闲时间超过了keepAliveTime将被终止。
  • workQueue 任务队列:用于传输和保存等待执行任务的阻塞队列
    • 线程数<corePoolSize,Exector优先生成新线程,任务不进入队列。
    • 线程数>=corePoolSize,Exector优先考虑把任务加入队列。
    • 任务队列满后,考虑创建新线程。如果线程池数量超过maximumPoolSize ,执行线程饱和策略。
  • threadFactory 线程创建工厂
  • handler 线程饱和策略
    • AbortPolicy:处理程序遭到拒绝,并且抛出异常。
    • CallerRunsPolicy:调用者所在线程来运行该任务
    • DiscardPolicy:无法执行,抛弃任务。
    • DiscardOldestPolicy:FIFO,抛弃队列头部的任务。

任务队列

  • ArrayBlockingQueue 基于数组的有界阻塞队列
    • 队列按照FIFO管理任务,队列头是在队列中存货时间最长的任务。
    • 该类型的工作队列一旦创建,长度固定。
  • LinkedBlockingQueue 基于链表的无界阻塞队列
    • 队列采用FIFO对工作任务进行管理。
    • 基于链表的队列吞吐量通常高于数组的队列。
  • SynchronousQueue 同步阻塞队列
    • 每个插入操作必须等待另外一个线程对应的移除操作,等待过程处于阻塞状态。
    • 同步阻塞队列不谈容量,插入-移除循环迭代执行。
    • Executors.newCachedThreadPool使用了该队列。
  • PriorityBlockingQueue 基于优先级的无界阻塞队列
    • 优先级队列的工作任务按照自然顺序进行排序,也可Comparator构建排序规则。
    • 该队列理论上无解,但是受到物理资源限制导致OOM

标签:...,Java,队列,创建,阻塞,任务,线程
From: https://www.cnblogs.com/markseven/p/17213065.html

相关文章

  • 线程池
    基本原理:    importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassExecutorsDemo{//创建线程池的两......
  • Linux进程与线程的基本概念及区别
    前言假设你正在玩一款在线多人游戏,在游戏中,有多个角色需要进行不同的操作,例如攻击、移动、释放技能等等。接下来,我们用玩游戏的例子,来解释进程和和线程的概念,以及进程和......
  • java中的注解、自定义注解
    注解注解概述​ 注解类似于一个商品标签,给当前程序的开发者提供信息和标记,给java编译程序员或者jvm提供数据支持和标记,有着代码量少,易读性更高的好处,本质还是一个特殊的......
  • Git 仓库7K stars!学Java开源项目austin要多久?
    我是3y,一年CRUD经验用十年的markdown程序员......
  • Java数组
    Java数组1.数组概述数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元......
  • 线程状态
       ......
  • Java简介
    Java是什么?Java是由Sunmicrosystem公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。Java分为三个体系:JavaSE(J2SE)(Java2platformstandardedition,J......
  • Java基础语法
    Java基础语法Java程序是一系列对象的集合,而这些对象通过调用彼此来实现协同工作。对象:对象是类的一个实例,有状态和行为。例如:一条狗是一个对象,它的状态有:颜色、名字、品......
  • Java三大集合类 - List
    ListSetMap一、List几个小问题:1、接口可以被继承吗?(可以)2、接口可以被多个类实现吗?(可以)3、以下两种写法有什么区别?//Listlist1=newList();是错误的因为List()是......
  • Java(单元测试,反射)
    单元测试、反射一、单元测试1.1单元测试快速入门所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。我们想想,咱们之前是怎么进行测试的呢?比如说我......