线程的创建和关闭需要花费时间,可能会浪费资源,所以可以通过让线程复用来解决这个问题。

线程池就是这样一个概念,当需要创建线程的时候直接从线程池中获取,当关闭线程的时候直接归还线程给线程池。

ThreadPoolExecutor就是JDK提供的这样一个类。

它继承AbstructExecutorService类,AbstructExecutorService类实现ExecutorSerive接口,ExecutorSerive接口继承Executor接口。

具体方法可以在API中自行查看。

看一下ThreadPoolExtcutor的构造方法:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}

下面是对它参数的解释:

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

maximumPoolSize:指定了线程池中线程的最大数量

keepAliveTime:当线程数量超过corePoolSize,多余线程的存活时间

TimeUnit:keepAliveTime的单位

workQueue:任务队列,被提交但还没执行的任务

threadFactory:用于创建线程

Handler:线程太多的拒绝策略

线程池有四个构造函数,其他三个只是把一些参数变成了默认而已,然后调用的这个构造函数。

对线程池类有点基本的了解之后接下来看看另一个类Extcutors。它是一个工厂类,可以从它获得特定功能的线程池。

public static ExecutorService newFixedThreadPool(xxxxxxx)public static ExecutorService newSingleThreadExecutor(xxxx) public static ExecutorService newCachedThreadPool(xxxxx)public static ScheduledExecutorService newSingleThreadScheduledExecutor(xxxx)public static ScheduledExecutorService newScheduledThreadPool(xxxxx)

功能分别是获得固定线程数目的线程池,获得一个线程的线程池,获得线程数量可变的线程池,获得可在给定时间执行的单线程池,获得可在给定时间执行的多线程池。

对于前三个来说,它们只是根据参数不同对ThreadPoolExecutor进行了封装。

而ScheduledExecutorService则是继承自ExecutorService,又在它的基础上添加了一些功能。

写个小例子:

public class demo implements Runnable{public static void main(String[] args) {ExecutorService es=Executors.newFixedThreadPool(2);for(int i=0;i<10;i++){es.submit(new Thread(new demo()));}}public void run() {System.out.println(System.currentTimeMillis());try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}
}

获得一个数量为2的固定线程数量线程池,在run里面每个线程sleep两秒,结果如下

可以清楚地看到每两秒后两个线程被执行。

线程的逻辑调度如下:

当线程池满,队列也满的时候,会采用拒绝策略,JDK提供了四种内置拒绝策略在线程池类里面:

具体的可以自行查找相关资料。

自此告一段落,线程池还有很多内容没有总结,后续再总结吧。

转载于:https://www.cnblogs.com/blogofjzq/p/9405773.html

Java高并发程序设计(六)--线程池(1)相关推荐

  1. Java高并发编程:线程池

    这里首先介绍了java5中的并发的小工具包:java.util.concurrent.atomic,然后介绍了线程池的概念,对使用java5的方式创建不同形式的线程进行了演示,之后介绍了两个 对象:C ...

  2. Java并发基础(六) - 线程池

    Java并发基础(六) - 线程池 1. 概述 这里讲一下Java并发编程的线程池的原理及其实现 2. 线程池的基本用法 2.1 线程池的处理流程图 该图来自<Java并发编程的艺术>: ...

  3. 《实战Java高并发程序设计》github笔记和源码

    笔记 <实战Java高并发程序设计>中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了 笔者做了相关笔记并整理源代码,欢迎 ...

  4. JAVA高并发程序设计(葛一鸣著)读书笔记

    本文为JAVA高并发程序设计(葛一鸣著)读书笔记.这本书对于刚刚入门的童鞋来讲可能有点深,我推荐可以先看看Java多线程编程核心技术(高洪岩著)一书. 第一章 走入并行世界 什么是同步和异步? 同步就 ...

  5. Java高并发程序设计入门

    转自:http://blog.csdn.net/johnstrive/article/details/50667557 说在前面 本文绝大部分参考<JAVA高并发程序设计>,类似读书笔记和 ...

  6. Java高并发程序设计(三)——JDK并发包(二)

    引言 好久没来学习Java高并发程序设计了,感觉在慢慢遗忘之前学过的内容,今天打算重新拾起. Condition Condition与前两章讲的Object.wait() 和Object.notify ...

  7. 《实战 Java 高并发程序设计》笔记——第3章 JDK 并发包(二)

    文章目录 3.2 线程复用:线程池 3.2.1 什么是线程池 3.2.2 不要重复发明轮子:JDK 对线程池的支持 1. 固定大小的线程池 2. 计划任务 3.2.3 刨根究底:核心线程池的内部实现 ...

  8. 实战java高并发程序设计-笔记进行中

    <JAVA并发编程实践>:出书时间太早,内容比较散,专业术语翻译较早和现在有差异 <Java并发编程的艺术>:手绘图较多文字内容较少,主要讲解并发实现的底层原理和面临的问题,底 ...

  9. Java高并发系列5-线程池

    Java高并发系列5-线程池 接上一篇Java并发系列4-并发容器我们继续 在编程中经常会使用线程来异步处理任务,但是每个线程的创建和销毁都需要一定的开销.如果每次执行一个任务都需要开个新线程去执行, ...

  10. java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

最新文章

  1. PHP标量类型中整型类型的,PHP数据类型概述
  2. 读书 - Delphi下深入Windows核心编程 第二天
  3. 读债务危机0819:政府成立救助基金
  4. jack对海量数据库的一些总结
  5. html坐标定位图解,HTML5地理定位实例
  6. C语言 2048小游戏
  7. 重磅来袭 | 移动云城市峰会分论坛暨移动云TeaTalk青岛站 即将开启
  8. 我从机器人先生那里了解到了有关InfoSec的全部信息
  9. 不知道工作组名称怎样加入_黄瓜汁加入适量的蜂蜜功效竟然这么好!不看不知道,一看吓一跳!_人类...
  10. Oracle创建临时表
  11. G120XA与S7-1200的Modubus通信(一)
  12. 计算机网络双绞线实验报告
  13. 【学习记录——unity 3D】Stealth秘密行动游戏制作(一)
  14. STM32F103通过M26实现远程在线IAP
  15. Tkinter——②entry(文本框)和text(多行文本)
  16. BZOJ3730 震波+BZOJ4372 烁烁的游戏(动态点分治)
  17. 遥感影像云检测-传统方法-:Haze Optimized Transformation(HOT)方法
  18. macbarcode软件_条形码生成器 for mac-条形码生成器 mac版下载V17.0__西西软件下载
  19. CTF靶场系列结——综合环境
  20. k8s 容器编排(高级版)

热门文章

  1. 树莓派i2c python_树莓派2 python i2cPython中chr、unichr、ord字符函数之间的对比
  2. 怎样用MATLAB画二次函数曲线,MATLAB 二次函数的画图.doc
  3. Node.js 极简笔记
  4. 如何在 GPU 上加速数据科学
  5. android 按键会触发ontouch吗?_这次,我把Android事件分发机制翻了个遍
  6. 大数据hadoop资源网址
  7. scala中使用Option、Some、None,避免使用null
  8. golang常用库:字段参数验证库-validator使用
  9. Showing multiple lines on a single chart in Node-RED
  10. 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(五)