线程池的思想概述

我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结東了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

Java中可以通过线程池来达到这样的效果。下面们就来详细讲解一下Java的线程池。

线程池概念

线程池其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需因为反复创建线程而消耗过多资源。

由于线程池中有很多操作都是与优化资源相关的,在这里就不多述。我们通过一张图来了解线程池的工作原理

合理利用线程池能够帯来三个好处

降低资源消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

提高线程的可管理性。可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

线程池的原理

当程序第一次启动的时候创建多个线程保存到一个集合中

当我们想要使用线程的时候就可以从集合中取出来线程使用

Thread t = list.remove(index);返回的是被移除的元素(线程只能被一个任务使用)

Thread t = linked.removeFirst();返回的是被移除的第一个元素

当我们使用完毕线程需要把线程归还给线程池

list. add(t);

linked.add Last(t);

线程池的简单实现

/*** 线程池:

* JDK1.5之后提供的java.util.concurrent.Executors:线程池的工厂类,用来生成线程池。

* Executors类中的静态方法static ExecutorService newFixedThreadPool( int nThreads):创建一个可重用固定线程数的转程池

* 参数:

* int nThreads:创建线程池中包含的线程数量

* 返回值:

* ExecutorService接口,返回的是 ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接收(面向接口编程)*/

java.util.concurrent.ExecutorService:线程池接口用来从线程池中获取线程,调用start方法,执行线程任务。

submit(Runnable task):提交一个 Runnable任务用于执行

void shutdown():关闭/销毁线程池

线程池使用步骤

使用线程池的工厂类Executors里边提供的静态方法 newFixedThreadPool生产一个指定线程数量的线程池。

创建一个类,实现Runnable接口重写run方法,设置线程任务。

调用ExecutorService中的方法 submit,传递线程任务(实现类)开启线程,执行run方法。

调用ExecutorService中的方法 shutdown销毁线程池(不建议执行)

代码实现

importjava.util.concurrent.Executors;importjava.util.concurrent.ExecutorService;public classDemoThreadPool {public static voidmain(String[] args) {//1.使用线程池的工厂类Executors里边提供的静态方法 newFixedThreadPool生产一个指定线程数量的线程池。

ExecutorService executorService = Executors.newFixedThreadPool(3);//3.调用ExecutorService中的方法submit,传递线程任务(实现类)开启线程,执行run方法。//线程池会一直开启,使用完了线程,会自动把线程归还给线程池,线程池可以继续使用

executorService.submit(newRunnable01());

executorService.submit(newRunnable01());

executorService.submit(newRunnable01());

executorService.submit(newRunnable01());//4.调用ExecutorService中的方法 shutdown销毁线程池(不建议执行)//executorService.shutdown();

}

}

控制台输出:

线程名称:pool-1-thread-2线程名称:pool-1-thread-1线程名称:pool-1-thread-3线程名称:pool-1-thread-3

java线程池概念_Java 线程池概念、原理、简单实现相关推荐

  1. java线程池的概念_Java线程池的基本概念以及生命周期

    一.为什么要实现线程池? 线程的创建与销毁对于CPU而言开销较大,通过池化技术可避免重复的创建与销毁线程. 方便与线程资源统一管理. 二.几种常见的线程池以及核心参数 不推荐使用Executor创建线 ...

  2. java io密集型任务_Java线程池讲解——针对IO密集型任务

    sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...

  3. java 线程的基本概念_Java多线程——基本概念

    线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程 线程:是比进 ...

  4. java线程不执行_java线程池,阿里为什么不允许使用Executors?

    带着问题 阿里Java代码规范为什么不允许使用Executors快速创建线程池? 下面的代码输出是什么? ThreadPoolExecutor executor = new ThreadPoolExe ...

  5. java线程池执行器_Java线程池ThreadPoolExecutor的使用

    Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...

  6. java 线程池数量_java线程池及创建多少线程合适

    java线程池 1.以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolS ...

  7. java线程池功能_Java线程池总结

    一.线程池 线程池适合处理的任务:执行时间短.工作内容较为单一. 合理使用线程池带来的好处: 1)降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的开销 2)提高响应速度:当任务到达时,任务可 ...

  8. java线程池中断处理_Java线程中断机制

    1. 引言 对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此.中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedException还是重设中 ...

  9. java线程池分类_JAVA线程池有几种类型?

    常用的JAVA线程池有以下几种类型: 1.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. 这种类型的线程池特点是 ...

最新文章

  1. css中底部sticky footer
  2. 基于HTML5 Canvas实现工控2D叶轮旋转
  3. mybatis select语句会默认带排序吗_MyBatis中#和$的区别详解
  4. Java中几个主流的数据库连接池
  5. Android延时执行调用的几种方法
  6. 算法题目——子序列和问题(poj-3061)(尺取法)
  7. 1381. 设计一个支持增量操作的栈
  8. 对windows更多的理解
  9. 若依如何防止请求重复提交?
  10. android device id修改器,修改硬盘ID硬盘序列号工具(Serial Number Changer)
  11. VIVO校招C++岗面经(笔试+一面+二面+Offer)
  12. 多聚赖氨酸大鼠血清白蛋白纳米粒|微囊藻毒素小麦麦清白蛋白纳米粒|雌三醇乳清白蛋白纳米粒Estriol-whey protein
  13. windows symbols
  14. sv编程语言_sv零星知识点
  15. 容器环境下如何将NuGet包XML文档添加到Swagger
  16. 【vue-router源码】五、router.addRoute、router.removeRoute、router.hasRoute、router.getRoutes源码分析
  17. 招商银行证书到期后不同机器恢复导致的问题——“用户密码、证件号码和证书错误#3”
  18. 《数学之美》一些知识
  19. swap函数 交换 vector 里面的两个元素
  20. 前后台系统和RTOS系统的区别

热门文章

  1. python 自动化测试
  2. 解决子元素浮动,父元素没有撑开的问题
  3. WPF 凭证分录控件
  4. 标准C程序设计七---120
  5. 关于用Java写的贪吃蛇游戏的一些感想
  6. Oracle v$session_longops 视图说明
  7. spring boot(三)Junit 测试controller
  8. 【php】Windows PHP及xdebug安装 安装
  9. 码表的理解(ASCII,GBK,Unicode,UTF-8等)。
  10. js学习总结----js中常用的四种输出方式