线程数

JAVA线程池原理详解一

匿名 (未验证) 提交于 2019-12-02 21:53:52
线程池的优点 1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。 2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。 线程池的创建 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) corePoolSize:线程池核心线程数量 maximumPoolSize:线程池最大线程数量 keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间 unit:存活时间的单位 workQueue:存放任务的队列 handler:超出线程范围和队列容量的任务的处理程序 线程池的实现原理 提交一个任务到线程池中,线程池的处理流程如下: 1、判断 线程池里的核心线程 是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。 2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里

JAVA之创建线程与线程池

匿名 (未验证) 提交于 2019-12-02 21:53:52
JAVA创建线程的方式有三种,分别是: 继承Thread 实现Runnable 实现Callable 1、继承Thread 通过继承抽象类Thread,创建MyThreadExtends对象,调用其start方法。 package Thread; import java.util.concurrent.*; public class TestThread { public static void main(String[] args) throws Exception { testExtends(); } public static void testExtends() throws Exception { Thread t1 = new MyThreadExtends(); Thread t2 = new MyThreadExtends(); t1.start(); t2.start(); } } class MyThreadExtends extends Thread { @Override public void run() { System.out.println( "通过继承Thread,线程号:" + currentThread().getName()); } } 2、实现Runnable 通过实现接口Runnable,创建Runnable对象r

详细讲解线程池的使用

匿名 (未验证) 提交于 2019-12-02 21:53:32
一:解析参数 为了更好地理解threadpoolexecutor,我先讲一个例子,话说一个工作多年的高T,一天突然决定自己要单干组织一个团队,经过仔细的考虑他做出了如下的决定 1、团队的 核心人员为10个 2、如果一旦出现项目过多人员不足的时候,则会 聘请5个外包人员 3、接的项目单子 最多堆积100 4、如果项目做完了团队比较空闲,则裁掉外包人员, 空闲的时间为一个月 5、如果接的单子超过100个,则后续考虑一些 兜底策略 (比如拒绝多余的单子,或者把多出100个以外的单子直接交付第三方公司做) 6、同时他还考虑了如果效益一直不好,那么就裁掉所有人,宣布公司直接倒闭 上面的例子恰恰和我们的线程池非常的像,我们来看下threadpoolexecutor的定义。 ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler); corePoolSize :核心线程数(就是我们上面说的一个公司核心人员) maximumPoolSize :最大线程数

Java必备主流技术流程图

匿名 (未验证) 提交于 2019-12-02 21:52:03
1、Spring的生命周期 Spring作为当前java最流行性、最强大的轻量级容器框架,了解熟悉Spring的生命周期非常有必要 容器启动后,对bean进行初始化 按照bean的定义,注入属性 检测该对象是否实现xxxAware接口,并将相关的xxxAware实例注入给bean,如BeanNameAware等 以上步骤,bean对象已经正确构造,通过实现BeanPostProcessor接口,可以再进行一些自定义方法处理,如:postProcessBeforeInitialzation BeanPostProcessor的前置处理完成后,可以实现postConstruct,afterPropertiesSet,init-method等方法,增加我们自定义的逻辑。 通过实现BeanPostProcessor接口,进行postProcessAfterInitialzation后置处理 接着Bean准备好被使用啦 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法 通过给destroy-method指定函数,就可以在bean销毁前执行指定的逻辑 2、TCP三次握手,四次挥手 tcp的三次握手四次挥手是每个程序员都应该熟悉的。 三次握手 第一次握手(SYN=1,seq=x),发送完毕后,客户端进入SYN_SEND状态 第二次握手(SYN

Java多线程(十三):线程池

匿名 (未验证) 提交于 2019-12-02 21:52:03
1.Executor是顶级接口,有一个execute方法。 2.ExecutorService接口提供了管理线程的方法。 3.AbstractExecutorService管理普通线程,SchedulerExecutorService管理定时任务。 简单的示例 public class MyThread46 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Integer>(); ThreadPoolExecutor tp = new ThreadPoolExecutor(100, 100, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(20000)); final Random random = new Random(); for (int i = 0; i < 20000; i++) { tp.execute(new Runnable() { public void run() { l.add(random.nextInt()); } }); } tp.shutdown(); try { tp

Java线程池详解_JDK1.8.0_191

匿名 (未验证) 提交于 2019-12-02 21:52:03
Java线程池 线程池的作用 1.重用存在的线程,减少处理多请求时线程创建、销毁产生的开销。 2.请求达到时工作线程通常已经存在,请求无需等待,提高系统的响应性。 Executors中线程池的静态工厂方法 1.newFixedThreadPool 创建一个定长的线程池,每当提交一个任务就创建一个线程,直到达到池的最大长度,这时线程池会保持长度不再变化。 2.newCachedThreadPool 创建一个可缓存的线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活地回收空闲的线程,当需求增加时,它可以灵活添加新的线程。 3.newSingleThreadExecutor 创建一个单线程化的executor,它只创建唯一的工作者线程来执行任务,executor会保证任务依照任务队列所规定的顺序(FIFO、LIFO、优先级)执行。 4.newScheduledThreadPool 创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。 ThreadPoolExecutor类中线程池的构造函数 /** * 通过给定的初始化参数创建一个线程池(ThreadPoolExecutor) * * @param corePoolSize 线程池的核心线程数,核心线程即使空闲也不会被销毁, * 除非allowCoreThreadTimeOut被设置 * @param

Java程序员必备的一些流程图

纵饮孤独 提交于 2019-12-02 20:13:30
转自: https://juejin.im/post/5d214639e51d4550bf1ae8df 前言: 整理了一些Java基础流程图/架构图,做一下笔记,大家一起学习。 1.spring的生命周期 Spring作为当前Java最流行、最强大的轻量级容器框架,了解熟悉spring的生命周期非常有必要; 首先容器启动后,对bean进行初始化 按照bean的定义,注入属性 检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean,如BeanNameAware等 以上步骤,bean对象已正确构造,通过实现BeanPostProcessor接口,可以再进行一些自定义方法处理。 如:postProcessBeforeInitialzation。 BeanPostProcessor的前置处理完成后,可以实现postConstruct,afterPropertiesSet,init-method等方法, 增加我们自定义的逻辑, 通过实现BeanPostProcessor接口,进行postProcessAfterInitialzation后置处理 接着Bean准备好被使用啦。 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法 通过给destroy-method指定函数,就可以在bean销毁前执行指定的逻 2

java中线程池参数设置

半城伤御伤魂 提交于 2019-12-02 19:52:21
本文主要介绍线程池是解决了哪些问题以及线程池中 的corePoolSize(核心线程数),queueCapacity(等待队列的长度),maximumPoolSize(最大核心线程数)。本文不会对线程池各个参数介绍,假定你已经了解了线程池各个参数的含义。 1 为什么要有线程池呢? 当前实际应用中,经常会遇到单个请求处理时间短但请求量巨大但问题,简单说就是qps很高,平响时间很短的情况。这些情况下如果采用来一个任务就新建一个线程处理,那么会有什么问题呢? 1、每个任务新建一个线程,qps越高,就越消耗cpu资源新建线程;平响很短也需要cpu不断的销毁线程。从而会大量消耗cpu资源 2、创建的线程越多,cpu在处理任务时,线程切换相对更加频繁。导致cpu浪费在线程切换上的时间就会变长,从而会增加平响时间。 3、每个线程的创建都是要消耗内存资源的。高qps情况下容易出现OOM(unable to create new native Thread) 4、操作系统本身也不允许线程无限对增长 基于以上4个问题,线程池应运而生。 线程池中核心线程数能够重复使用,应对高qps无须频繁新建线程,进而减少线程之间切换的耗时;阻塞队列能够暂时缓存新到任务,作为新建线程的缓冲池。 2 线程池核心参数的计算 先列出计算公式,然后举例解释说明 2.1 核心线程数 corePoolSize=20% *

关于线程池的执行原则及配置参数详解

孤街醉人 提交于 2019-12-02 19:50:42
作者博客地址: http://gudong.name 本文博客地址: http://gudong.name/2017/05/03/thread-pool-intro.html 池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能。Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生成线程池,通过 Executors 可以方便的生成不同类型的线程池。但是要更好的理解使用线程池,就需要了解线程池的配置参数意义以及线程池的具体工作机制。 下面先介绍一下线程池的好处以及创建方式,接着会着重介绍关于线程池的执行原则以及构造方法的参数详解。 线程池的好处 引用自 http://ifeve.com/java-threadpool/ 的说明: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 创建线程池 //参数初始化 private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

java线程池学习(六) —— 线程池的合理配置

强颜欢笑 提交于 2019-12-02 19:50:31
一、确定线程数 在工作中,为了加快程序的处理速度,我们需要将问题分解成若干个并发执行的任务。接着我们将这些任务委派给线程,以便使它们可以并发的执行。但是需要注意的是,由于资源所限,我们不能创建过多的线程。 这就涉及到一个 确定创建多少线程数才是合理 的问题。 《java虚拟机并发编程》一书中,对这个问题有详尽的解答,本人在此摘取归纳如下: 1.我们可以先获取到系统可用的处理器核心数: Runtime.getRuntime().availableProcessors() 2.确定任务的类型: 如果所有任务都是 计算密集型 的,则创建处理器可用核心数那么多的线程数就可以了。 在这种情况下,创建更多的线程对程序的性能而言反而是不利的。因为当有多个任务处于就绪状态时, 处理器核心需要在线程间频繁进行上下文切换 ,而这种切换对程序性能损耗较大。 如果任务都是 IO密集型 的,那么我们需要开更多的线程来提高性能。 当一个任务执行IO操作时,其线程被阻塞,于是处理器可以立即进行上下文切换以便处理其他就绪线程。 如果我们只有处理器可用核心数那么多线程的话,则即使有待执行的任务也无法处理 ,因为我们已经拿不出更多的线程供处理器调度了。 3.计算出程序所需的线程数: 首先我们要明白一个概念叫 阻塞系数 如果任务有50%的时间处于阻塞状态,则阻塞系数为0.5。则程序所需的线程数为处理器可用核心数的两倍