java线程池概念_Java 线程池概念、原理、简单实现
线程池的思想概述
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结東了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。
那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?
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 线程池概念、原理、简单实现相关推荐
- java线程池的概念_Java线程池的基本概念以及生命周期
一.为什么要实现线程池? 线程的创建与销毁对于CPU而言开销较大,通过池化技术可避免重复的创建与销毁线程. 方便与线程资源统一管理. 二.几种常见的线程池以及核心参数 不推荐使用Executor创建线 ...
- java io密集型任务_Java线程池讲解——针对IO密集型任务
sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...
- java 线程的基本概念_Java多线程——基本概念
线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程 线程:是比进 ...
- java线程不执行_java线程池,阿里为什么不允许使用Executors?
带着问题 阿里Java代码规范为什么不允许使用Executors快速创建线程池? 下面的代码输出是什么? ThreadPoolExecutor executor = new ThreadPoolExe ...
- java线程池执行器_Java线程池ThreadPoolExecutor的使用
Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...
- java 线程池数量_java线程池及创建多少线程合适
java线程池 1.以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolS ...
- java线程池功能_Java线程池总结
一.线程池 线程池适合处理的任务:执行时间短.工作内容较为单一. 合理使用线程池带来的好处: 1)降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的开销 2)提高响应速度:当任务到达时,任务可 ...
- java线程池中断处理_Java线程中断机制
1. 引言 对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此.中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedException还是重设中 ...
- java线程池分类_JAVA线程池有几种类型?
常用的JAVA线程池有以下几种类型: 1.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. 这种类型的线程池特点是 ...
最新文章
- css中底部sticky footer
- 基于HTML5 Canvas实现工控2D叶轮旋转
- mybatis select语句会默认带排序吗_MyBatis中#和$的区别详解
- Java中几个主流的数据库连接池
- Android延时执行调用的几种方法
- 算法题目——子序列和问题(poj-3061)(尺取法)
- 1381. 设计一个支持增量操作的栈
- 对windows更多的理解
- 若依如何防止请求重复提交?
- android device id修改器,修改硬盘ID硬盘序列号工具(Serial Number Changer)
- VIVO校招C++岗面经(笔试+一面+二面+Offer)
- 多聚赖氨酸大鼠血清白蛋白纳米粒|微囊藻毒素小麦麦清白蛋白纳米粒|雌三醇乳清白蛋白纳米粒Estriol-whey protein
- windows symbols
- sv编程语言_sv零星知识点
- 容器环境下如何将NuGet包XML文档添加到Swagger
- 【vue-router源码】五、router.addRoute、router.removeRoute、router.hasRoute、router.getRoutes源码分析
- 招商银行证书到期后不同机器恢复导致的问题——“用户密码、证件号码和证书错误#3”
- 《数学之美》一些知识
- swap函数 交换 vector 里面的两个元素
- 前后台系统和RTOS系统的区别