线程池怎么实现的,核心参数讲一讲?

Executors是线程池的工厂类,通过调用它的静态方法如下:

Executors.newCachedThreadPool();
Executors.newFixedThreadPool();

可返回一个线程池。这些静态方法统一返回一个ThreadPoolExecutor,只是参数不同。

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

1、corePoolSize:指定了线程池中线程的数量

2、maximumPoolSize:线程池中的最大线程数量

3、keepAliveTime:当线程池中线程数量超过corePoolSize时,多余的空闲线程的存活时间

4、unit:上一个参数keepAliveTime的单位

5、任务队列:被提交还未被执行的任务

6、threadFactory:线程工厂,用于创建线程,一般默认工厂即可

7、handler:拒绝策略,当任务太多来不及处理,采用什么方法拒绝任务

最重要的是任务队列和拒绝策略

任务队列主要有ArrayBlockingQueue有界队列、LinkedBlockingQueue无界队列、SynchronousQueue直接提交队列。

1、ArrayBlockingQueue:

当线程池中实际线程数小于核心线程数时,直接创建线程执行任务;

当大于核心线程数而小于最大线程数时,提交到任务队列中;

因为这个队列是有界的,当队列满时,在不大于最大线程的前提下,创建线程执行任务;

若大于最大线程数,执行拒绝策略。

2、LinkedBlockingQueue:

当线程池中实际线程数小于核心线程数时,直接创建线程执行任务;

当大于核心线程数而小于最大线程数时,提交到任务队列中;

因为这个队列是无界的,所以之后提交的任务都会进入任务队列中。

newFixedThreadPool就采用了无界队列,同时指定核心线程和最大线程数一样。

3、SynchronousQueue:

该队列没有容量,对提交任务不做保存,直接增加新线程来执行任务。

newCachedThreadPool使用的是直接提交队列,核心线程数是0,最大线程数是整型的最大值,

keepAliveTime是60s,因此当新任务提交时,若没有空闲线程都是新增线程来执行任务,

不过由于核心线程数是0,当60s就会回收空闲线程。

当线程池中的线程达到最大线程数时,就要开始执行拒绝策略了,如下:

1、直接抛出异常

2、在调用者的线程中,运行当前任务

3、丢弃队列最近的一个任务,也就是将队列头的任务poll出去

4、默默丢弃无法处理的任务,不做任何处理

Java线程池使用和常用参数(待续)的更多相关文章

  1. Java线程池使用和常用参数

    多线程问题: 1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源. 2.java中简单的实现多线程的方式 ...

  2. java线程池和五种常用线程池的策略使用与解析

    java线程池和五种常用线程池策略使用与解析 一.线程池 关于为什么要使用线程池久不赘述了,首先看一下java中作为线程池Executor底层实现类的ThredPoolExecutor的构造函数 pu ...

  3. java线程池与五种常用线程池策略使用与解析

    背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...

  4. Java线程池参数

    关于Java线程池的参数设置.线程池是Java多线程里开发里的重要内容,使用难度不大,但如何用好就要明白参数的含义和如何去设置.干货里的内容大多是参考别人的,加入了一些知识点的扩充和看法.希望能对多线 ...

  5. Java线程池七个参数详解

    Java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释. 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize.maximumPoolS ...

  6. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  7. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  8. [转 ]-- Java线程池使用说明

    Java线程池使用说明 原文地址:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1. ...

  9. java线程池的使用与详解

    java线程池的使用与详解 [转载]本文转载自两篇博文:  1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html   ...

随机推荐

  1. 让块元素在同一行显示的方法: float 和inline-block

    float: 定义:按照一个指定的方向移动,遇到父级的边界或者相邻的浮动元素就会停下来(不完全脱离文档流) 值: left.right.none 特点: 1.浮动的块元素可以在一行显示,宽度是被内容撑 ...

  2. ios 虚拟机中文件下载路径

    每个人mac上的路径会有不同,你可以打印出你文件下载存放的路径,然后拷贝一下,再单击桌面空白处,最上面的导航栏上有个“前往”,然后找到“前往文件夹”,粘贴一下,就可以找到了.

  3. 使用 JSONDoc 记录 Spring Boot RESTful API

    这个博文可以分为两部分:第一部分我将编写一个Spring Boot RESTful API,第二部分将介绍如何使用JSONDoc来记录创建的API.做这两个部分最多需要15分钟,因为使用Spring ...

  4. Goolge-Guava Concurrent中的Service

    最近在学习了下Google的Guava包,发现这真是一个好东西啊..由于平时也会写一些基于多线程的东西,所以特意了解了下这个Service框架.这里Guava包里的Service接口用于封装一个服务对 ...

  5. c语言中使用自带的qsort(结构体排序)+ 快排

    c中没有自带的sort函数emm 不过有自带的qsort函数 (其实用法都差不多(只是我经常以为c中有sort 头文件要用 #include <stdlib.h> 一定要重新把指针指向的值 ...

  6. 【leetcode 简单】第十五题 加一

    给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: ...

  7. python模块之imghdr检测图片类型

    1. imghdr是什么 imghdr是一个用来检测图片类型的模块,传递给它的可以是一个文件对象,也可以是一个字节流. 能够支持的图片格式: 2. 如何使用 提供了一个api叫做imghdr.what ...

  8. 2、java语言基础

    1.关键字 被Java语言赋予特定含义的单词被称为关键字关键字都是小写的在Java开发工具中,针对关键字有特殊颜色的标记 2.标识符 Java标识符命名规则 ·标识符是由,数字,字母,下划线和美元符号 ...

  9. 深入理解Spring系列之十:DispatcherServlet请求分发源码分析

    转载 https://mp.weixin.qq.com/s/-kEjAeQFBYIGb0zRpST4UQ DispatcherServlet是SpringMVC的核心分发器,它实现了请求分发,是处理请 ...

  10. arch优化开机

    查看开机时间 systemd-analyze 具体开机时间 systemd-analyze blame 你可以systemctl --all | grep not-found 查看有哪些服务挂掉了.然 ...