常见线程池 newFixedThreadPool 的简单使用
package com.aaa.threaddemo; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /*
*一 四种常见的线程池是啥?
* newFixedThreadPool
* 1.创建一个可重用固定线程数的线程池, 2.使用共享的无界队列方式来运行这些线程。
*
* newCachedThreadPool
* 1.可根据需要创建新线程的线程池 2.旧的线程可用时将重用他们 3.对短期异步的程序 可提高程序性能
*
* newSingleThreadExecutor
* 1.返回一个线程池,只有一个线程 2.可以在旧的线程挂掉之后,重新启动一个新的线程来替代它。 达到起死回生的效果。
*
* newScheduledThreadPool
* 给定一个延迟后,可以运行命令或者定期执行。
* java中线程池的顶级接口是Executor 严格而言,正在的线程池是ExecutorService
*
*二 阻塞队列 LinkedBlockingQueue 使用注意事项?
*
*三 线程池提交任务的方式?
*
*四 shutdown 的使用方式?
*
*五 线程池中的常用参数设置?
*/ /*
二 newFixedThreadPool
* 1.创建一个固定大小的线程池
* 2.提交一个任务,就创建一个线程,直到线程池的最大容量。
* 3.线程池的大小达到最大值,就保持不变。
* 4.有执行异常而结束的线程,线程池会补充一个新的线程。
* 5.使用完毕,必须手动关闭线程池,否则会一直存在内存中
*
* 看一下newFiexdThreadPool()的内心世界
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
*/ public class ThreaPoolUser {
public static void main(String[] args) {
ExecutorService fixedPool = Executors.newFixedThreadPool(2); //创建一个可重用,固定线程数的线程池 容量为 2 /*
线程池的容量是2,我这里放入了3个线程,线程池会如何处理?
可以看到这里有个没有指定容量的队列 linkedBlockingQueue,此时的队列就是一个无边界的队列。
可以不断的在队列中添加任务
多放一个问题不大,300000个呢? 任务过多,就会导致内存溢出。 【注意!】
linkedBlockingQueue
本身是一个用链表结实现的有界阻塞队列,容量是可以设置的。
较好的使用方式 五 ExecutorService executorService = new ThreadPoolExecutor(
10, //核心线程数
13, //线程池最大容量
60L, //非核心线程的生存时间
TimeUnit.SECONDS, //生存的时间单位
new ArrayBlockingQueue(10)); //设置队列中的容量
*/
FiexdDemo fiexdDemo = new FiexdDemo();
FiexdDemo fiexdDemo2 = new FiexdDemo();
FiexdDemo fiexdDemo3 = new FiexdDemo(); /*
三 线程池提交任务的方式有两种
* 1.execute
* 提交的是runnable类型的任务,下文的线程是继承了thread,thread又是runnable的实现类。
* 提交是没有返回值的
* 遇到异常直接抛出
*
* 2.submit
* runnable 和 callable 都可提交
* 返回一个future类型的对象
* 将异常存储,调用future get方法 才会抛出异常
*/
fixedPool.execute(fiexdDemo);
fixedPool.execute(fiexdDemo2);
fixedPool.execute(fiexdDemo3); /*
四 shutdown()
* 1.把线程池的状态设置为 shutdown,但是并不会马上停止
* 2.停止接受外部的submit 任务
* 3.线程池正在运行的任务,队列中等待的任务,会执行完
* 4.完成后,才是真正的停止
*/
fixedPool.shutdown(); //手动关闭线程池
}
} /*
* 上面已经创建好了一个固定的线程池,这边创建一个多线程。
* 把线程放进 线程池中就完事了。
*/
class FiexdDemo extends Thread{
@Override
public void run() {
System.out.println("我是一个线程");
System.out.println("[currentThread = ]" + Thread.currentThread().getName());
}
}
看下结果

常见线程池 newFixedThreadPool 的简单使用的更多相关文章
- 常见线程池之 newCacheThreadPool 缓存线程池 简单使用
package com.aaa.threaddemo; import java.util.concurrent.BlockingQueue; import java.util.concurrent.E ...
- (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)
上篇文章中介绍了单线程化线程池newSingleThreadExecutor,可控最大并发数线程池(newFixedThreadPool)与其最大的区别是可以通知执行多个线程,可以简单的将newSin ...
- 常见线程池 newScheduledThreadPool 定时执行任务的线程池 简单介绍
一 定时任务 package com.aaa.threaddemo; import static java.util.concurrent.TimeUnit.NANOSECONDS; import ...
- JUC之线程池基础与简单源码分析
线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...
- java 线程池 ---- newFixedThreadPool()
class MyThread implements Runnable{ private int index; public MyThread(int index){ this.index = inde ...
- 6、java5线程池之固定大小线程池newFixedThreadPool
JDK文档说明: 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则 ...
- java 线程池newFixedThreadPool
工作中遇到一个这样的情况,List中的元素要每个遍历出来,然后作为参数传给后面通过spark做数据处理,元素太多,一个一个的遍历速度太慢,于是考虑使用多线程,代码如下:(已删除部分代码) 想了解更多线 ...
- Executor线程池的简单使用
我们都知道创建一个线程可以继承Thread类或者实现Runnable接口,实际Thread类就是实现了Runnable接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...
- c++简单线程池实现
线程池,简单来说就是有一堆已经创建好的线程(最大数目一定),初始时他们都处于空闲状态,当有新的任务进来,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他 ...
随机推荐
- 魔法串(hud4545)
魔法串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submiss ...
- 基于React和Node.JS的表单录入系统的设计与实现
一.写在前面 这是一个真实的项目,项目已经过去好久了,虽然很简单,但还是有很多思考点,跟随着笔者的脚步,一起来看看吧.本文纯属虚构,涉及到的相关信息均已做虚构处理, 二.背景 人活着一定要有信仰,没有 ...
- 如何基于LSM-tree架构实现一写多读
一 前言 PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性.海量存储.高性能.低成本的数据库服务.X-Engine是阿里巴 ...
- RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成
搭建好maven项目环境,加入RabbitMQ依赖包 <dependency> <groupId>org.springframework.amqp</groupId> ...
- vue使用v-chart图表出现的问题
npm i v-charts echarts -S 引入 import VCharts from 'v-charts' Vue.use(VCharts) 后发现报错,后来发现安装echarts版本太高 ...
- DP转LVDS方案 瑞奇达CS5211替代PS8625方案 CS5211芯片
PS8625将作为DP或eDP接收器设备出现在视频源中,并将作为LVDS显示面板的LVDS源设备.该设备是一个完全集成的解决方案,不需要外部CPU.内存.时钟基准或电压调节器.PS8625可配置为从显 ...
- Java EE数据持久化框架作业目录(作业笔记)
第1章 MyBatis入门>>> 1.1.4 在Eclipse中搭建MyBatis基本开发环境 1.2.5 使用MyBatis查询所有职员信息 1.3.3 获取id值为1的角色信息. ...
- HTML网页设计基础笔记 • 【第1章 HTML5基础】
全部章节 >>>> 本章目录 1.1 HTML介绍及开发工具 1.1.1 HTML 的基本概念 1.1.2 网页 1.1.3 Web 标准 1.1.4 HTML5 与移动互 ...
- 编写Java程序随机输入日期计算星期几,打印任意一年的日历
需求说明: 随机输入日期计算星期几,打印任意一年的日历 已知,1900年1月1日是星期1,用户随机输入年月日,计算星期几 实现思路: 一.知道1900年1月1日为星期一,求输入的年份月份与1900年1 ...
- docker启动emqx官方镜像,顺便启动exporter
注意,我是把把官方镜像放到了自己的仓库 1.emqx官方镜像启动 docker run -d --name emqx31 -p 1883:1883 -p 8083:8083 -p 8883:8883 ...