在Java开发过程中经常需要用到线程,为了减少资源的开销,提高系统性能,Java提供了线程池,即事先创建好线程,如果需要使用从池中取即可,Java中创建线程池有以下的方式,

1、使用ThreadPoolExecutor类

2、使用Executors类

其实这两种方式在本质上是一种方式,都是通过ThreadPoolExecutor类的方式,下面分析其使用方式。

一、ThreadPoolExecutor的方式

1、使用方法

查看JDK的源码,ThreadPoolExecutor类提供了以下构造方法,

可以看到有四个构造方法,先看第一个构造方法,其代码如下,

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}

从上面的代码中可以确定,我们需要传的参数有corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue

下面对这几个参数进行说明

corePoolSize:线程池的核心线程数;

maximumPoolSize:线程池的最大线程数;

keepAliveTime:线程池空闲时线程的存活时长;

unit:线程存活时长大单位,结合上个参数使用;

workQueue:存放任务的队列,使用的是阻塞队列;

在这个方法中调用了另外的一个构造方法,即上图中四个构造方法中的第四个,从源码中得知,一个线程池包含的属性共有corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler七个,上面说到了五个,下面是其他两个的含义,

threadFactory:线程池创建线程的工厂;

handler:在队列(workQueue)和线程池达到最大线程数(maximumPoolSize)均满时仍有任务的情况下的处理方式;

上面的七个参数,也即ThreadPoolExecutor的第四个构造方法需要的参数。

我们再来看中间的两个构造方法,和第一个的区别在于,第二个和第三个指定了创建线程的工厂和线程池满时的处理策略。

通过上面的方式便创建了线程池

二、Executors的方式

1、使用方法

Executors类提供了下面的构造方法,

可以看到提供了约10个的构造方法,但是发现其方法返回值为ExecutorService,这不是我们要的ThreadPoolExecutor那,别急,看下ExecutorService这个类是什么,

其源码如下,

其是一个接口,和ThreadPoolExecutor没什么关系那,不对,可以大胆猜想下,ThreaPoolExecutor可以实现接口,验证下我们的猜想,

ThreadPoolExecutor继承了AbstractExecutorService

AbstractExecutorService抽象类实现了ExecutorService接口,那么ThreadPoolExcutor和ExecutorService就有了关系。

我们再挑选ExecutorService中的方法看下其具体实现,

public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}

从上面的代码中可以看出,其返回的是ThreaPoolExecutor对象,调用的是ThreaPoolExecutor类四个构造方法中的第一个。

总结,上面两种创建线程池的方式,其本质都是通过ThreaPoolExecutor类的构造方法的方式,所以ThreaPoolExecutor是重点。

转载于:https://www.cnblogs.com/teach/p/10903164.html

java线程池之一:创建线程池的方法相关推荐

  1. executor线程池框架_如何使用Java 5 Executor框架创建线程池

    executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...

  2. 如何使用Java 5 Executor框架创建线程池

    Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概 ...

  3. Java用Callable接口创建线程

     一.概述  使用Callable接口创建线程能够返回数据.与Runnable接口创建线程的方式有点类似,也是需要通过Thread类来创建线程.由于Thread类的构造函数中没有Callable接口, ...

  4. Java 并发 多线程:创建线程的四种方式

    Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...

  5. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  6. 为什么阿里Java规约禁止使用Java内置Executors创建线程池?

    IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...

  7. java singleton 多线程_Java创建线程安全的单例singleton

    Java创建线程安全的单例 单例的使用场景 JVM中仅需要一个实例,因此能节省内存,加快访问速度,比如数据库连接池,计数器等.Spring 中的Bean,默认也是单例的,共享资源的访问,比如日志文件, ...

  8. java 创建线程_java多线程|创建线程的各种方式

    javaDEMO 本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~https: ...

  9. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  10. Java 并发编程之创建线程,启动和常用方法

    进程是处于运行过程中的程序:线程是进程中的一个执行单元:一个程序运行后至少有一个进程,一个进程中可以包含多个线程. Java 创建线程有三种方法: 1)继承 Thread 类 public class ...

最新文章

  1. CSS 定位之绝对与相对
  2. HTML5中引入JS
  3. 如何做好现状调研与需求分析
  4. ant接口自动化 junit_ant 学习(3)--结合junit形成自动化测试小框架
  5. float相乘后的类型_Psychopy | 第1期:数据类型及运算符
  6. 求1+2+3+...+n的值。
  7. android实现存储,Android开发实现文件存储功能
  8. 奇怪吸引子---Aizawa
  9. php怎么读,php 怎么读写文件?
  10. Python标准库学习笔记7:数据持久存储与交换
  11. 《信息系统项目管理师教程》目录
  12. 51单片机——LED点阵
  13. IT项目管理学习笔记(一)——第8-11章
  14. docker logs 查看日志
  15. 深度Linux拨号软件,Deepin调校及相关资源、常用软件整合贴
  16. 基于Raspberry Pi(树莓派)的MCC数据采集卡应用
  17. 用Compose shape把外框做成封闭图形
  18. TiDB实战篇-TiDB配置
  19. 一道有意思并对你有帮助的Promise题
  20. Oracle函数获取IDCARD中年龄

热门文章

  1. table 样式详解
  2. Linux 之 编译器 gcc/g++参数详解
  3. nyoj 题目5 Binary String Matching
  4. C语言的一些误用和知识总结
  5. 贪婪算法在求解最小生成树中的应用(JAVA)--Kruskal算法
  6. mac wordpress php7,Mac 下基于 wordpress 搭建个人博客系统
  7. java 批量提交_【INSERT】逐行提交、批量提交及极限提速方法
  8. python3 换源_CentOS 7.5 下 python3 安装及 pip 换源
  9. process 类 java_编写可执行jar——java的Process类的使用(二)
  10. SaltStack 第二板块安装说明 [2]