一、线程池:提前创建多个线程存放到集合容器中,其中的线程可以反复使用,减少资源的开销

作用就是:线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务

使用线程池中线程对象的步骤:

1. 创建线程池对象。

2..创建Runnable接口子类对象(线程所要执行的任务【target】)

3. 提交Runnable接口子类对象。

  public class ExecutorTest {
/**
* 一个线程池,2个线程,3个任务 Executors:线程池工具类(一个任务对应一个线程)
ThreadPoolExecutor底层实现是用非阻塞机制
* @param args
*/
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new RunableDemo());
executorService.submit(new RunableDemo());
executorService.submit(new RunableDemo());
}
}

二、创建线程池的5种方式:可缓存、定时、定长、单列、抢占

  1:创建单核心的线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
作用:线程池中使用的从始至终都是单个线程,所以这里的线程名字都是相同的,而且下载任务都是一个一个的来,直到有空闲线程时,
才会继续执行任务,否则都是等待状态。 2:创建固定核心数的线程池,这里核心数 = 2
ExecutorService executorService = Executors.newFixedThreadPool(2);
作用:两个线程执行任务可以同时进行,并且所用的线程数量始终都只有两个,因为它的最大线程数等于核心线程数,线程存活时间都是无限的,
不会再去创建新的线程了 3:创建一个自动增长的线程池
ExecutorService executorService = Executors.newCachedThreadPool();
作用:没有核心线程数,但是我们的最大线程数没有限制,所以一点全部开始下载,就会创建出 5 条新的线程同时执行任务,从上图的例子看出,
每天线程都不一样 4:创建一个具有抢占式操作的线程池
ExecutorService executorService = Executors.newWorkStealingPool();
作用:可以看出WorkStealingPool这个方法会以当前机器的CPU处理器个数为线程个数,这个线程池会并行处理任务,且不保证顺序,
同时并发数能作为参数设置,而任务如果想要都执行就要设置和任务数量对应的并发数。

三、源码代码分析:

当任务数<核心线程数时,任务由核心线程执行

当任务数>核心线程数&&任务数<阻塞队列长度时,任务由核心线程执行

当任务数>阻塞队列长度时,需要创建新线程(n),但核心线程数 + n不能大于最大线程数

java基础之线程池的更多相关文章

  1. Java基础教程——线程池

    启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这 ...

  2. java基础-多线程线程池

    线程池 * 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互.而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池.线程池里的每一个线程代 ...

  3. java基础系列——线程池

    一.线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池. public ThreadPoolExecutor(int corePoolSize, int maximumPo ...

  4. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  5. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  6. (转载)new Thread的弊端及Java四种线程池的使用

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...

  7. Java并发之——线程池

    一. 线程池介绍 1.1 简介 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡 ...

  8. Java多线程与线程池技术

    一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...

  9. java笔记--使用线程池优化多线程编程

    使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...

  10. Java多线程和线程池

    转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...

随机推荐

  1. 京东h5st参数js逆向

    扣代码的环节挺简单的就不讲了 直接到重点 发现许多包都会有一个h5st的加密参数 那么我们就要看这个参数是怎么生成的 我们可以根据请求堆栈 找到h5st的入口 当然还有一种更简单的方法 就是直接全局搜 ...

  2. C#客户端Json转DataTable

    本文转自 https://blog.csdn.net/pinebud55/article/details/52240287 感谢pinebud55分享 之前我们有讨论过c#是如何处理json的,在我的 ...

  3. Kali 关闭自动锁屏功能

    Kali 关闭自动锁屏功能 1.点击 [开始] -> [设置] -> [电源管理器] 2.选择 [安全性],将 [自动锁定会话] 选为 [从不],将 [当系统休眠时锁定屏幕] 取消勾选,点 ...

  4. GIS矢量数据获取:全球行政区划、路网、POI点、建筑物范围、信号基站等

      本文对目前主要的行政区边界与道路路网.建筑轮廓.POI.手机基站等数据产品的获取网站加以整理与介绍. 目录 5 行政区边界与建筑轮廓.POI.基站数据 5.1 行政区边界数据 5.1.1 DIVA ...

  5. Centos7下oracle12c的安装与配置

    一.硬件资源配置(虚拟机) CentOS7@VMware Workstation 10 Pro,分配资源:CPU:2颗,内存:4GB,硬盘空间:20GB+30GB 二.软件环境配置 软件上传 xshe ...

  6. linux mint安装触控板手势fusuma

    安装必要的包,终端输入: sudo apt-get install libinput-tools sudo apt-get install xdotool sudo gem install fusum ...

  7. .NET Core内存结构体系(Windows环境)底层原理浅谈

    物理内存与虚拟内存 物理内存(Physical Memory) 定义:物理内存是计算机硬件中的实际RAM(如DDR5内存条),直接通过总线与CPU连接,用于临时存储运行中的程序和数据. 虚拟内存(Vi ...

  8. DevExpress MVVM Framework. Interaction of ViewModels. Messenger

    学习记录: 学习地址:https://community.devexpress.com/blogs/wpf/archive/2013/12/13/devexpress-mvvm-framework-i ...

  9. [TJOI2019] 甲苯先生的字符串 题解

    有点水了-- 考虑相邻的不能放在一起,不相邻的可以,那么很容易想到转移方程: \[dp_{i,j}=\sum_{k=0}^{25}dp_{i-1,k}[j,k不相邻] \] 其中 \(dp_{i,j} ...

  10. Linux服务器部署SpringBoot项目教程

    1. 服务器配置1.1 购买服务器1.2 配置安全组1.3 登录实例1.4 安装宝塔面板2. 配置宝塔2.1 创建数据库3. 打包部署项目3.1 修改项目配置3.2 打包3.3 部署3.4 放行端口3 ...