Java如何固定大小的线程池
作者:蛋黄酥要不要来一口 发布时间:2021-08-30 06:18:19
标签:Java,线程池
1.固定大小的线程池简介
线程池就是在程序启动的时候先建立几个可以使用的线程放在那里,然后等着具体的任务放进去,这个任务基本可以说都是Runnable的实现类,因此它减小了系统每次新建和销毁线程的开销,但同时增加了维护这些线程的开销,个中取舍看具体情况而定。
固定大小的线程池就是在启动的时候创建了固定个数的线程放在那里等待使用。
2.包装一个线程池对象
public class TaskPool{
private final ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newFixedThreadPool(9); // 创建一个大小为9的固定线程池,可以按照CPU的核数初步判定,如果CPU密集性任务则创建N+1个,如果是IO密集型任务则创建2N+1个,其中N即CPU的核数
protected void shutdown(){
// do something
// 这个方法等待线程池中所有已提交任务执行结束,不接收新任务,然后结束
executor.shutdown();
// 这个强制结束所有任务,然后正在等在的任务列表
// executor.shutdownNow();
}
protected void execute(Runnable command){
// do something
// 提交任务
executor.execute(command);
}
public void status(){
StringBuffer sb = new StringBuffer();
// 当前正在执行任务的线程数
sb.append(executor.getActiveCount() + "\n");
// 当前正在等待执行的线程数
sb.append(executor.getQueue().size() + "\n");
// 返回已经完成的线程数
sb.append(executor.getCompletedTaskCount() + "\n");
System.out.println(sb.toString());
// 注:以上方法都是返回一个大概值,因为线程在执行中,这些状态随时都会改变
}
}
3.使用线程池
public class Launcher{
private TaskPool taskPool = new TaskPool();
public static void main(String[] args){
// 新建100个任务,Runnable的实现类Task
Task[] tasks = new Task[100];
for (int i = 0; i < tasks.length; i++){
tasks[i] = new Task("Task " + (i+1));
// 提交到线程池运行
taskPool.execute(task[i]);
if ( i % 50 == 0){
taskPool.status();
}
}
private static class Task implements Runnable{
private String name;
public Task(String name){
this.name = name;
}
public void run(){
// do something
System.out.println("我的名字是:" + this.name);
}
}
}
Java线程池小拓展
线程池的介绍
1 常用的 池化技术
C3P0
DBCP
2 线程池的衍生
频繁的创建线程对象和多线程之间进行上下文切换,是非常耗时间和资源的所以JDK1.5中提出了线程池技术
3 使用线程池
Exector
4 线程池的创建
创建一个固定大小的线程池 ( 最常用的方法 )
ExecutorService pool = Executors.newFixedThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);//线程池的带下只有两个 现在这个任务在其等待队列中排队等候
创建可变大小的线程池
ExecutorService pool = Executors.newCachedThreadPool();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);
创建独立任务的线程池
ExecutorService pool = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);
创建可调度的线程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
threadPool.schedule(task, 2000, TimeUnit.MILLISECONDS);
来源:https://blog.csdn.net/zoubaicai/article/details/81122022


猜你喜欢
- IDEA单元测试报错:Class not found:xxxx springboot报错引入了新依赖,想着在测试模块进行测试。结果报错说Cl
- 背景最近在探秘kafka为什么如此快?其背后的秘诀又是什么?怀着好奇之心,开始像剥洋葱 一样逐层内嵌。一步步揭晓kafka能够吊打mq的真因
- 一、前言最近自己在学习Spring boot的过程中开发了一个组件 multithreadpool-spring-boot-starter,
- 我们学习网络编程最熟悉的莫过于Http,好,我们就从Http入手,首先我们肯定要了解一下h
- 本文实例为大家分享了Unity实现攻击范围检测并绘制检测区域的具体代码,供大家参考,具体内容如下一、圆形检测using System.Col
- 本文实例为大家分享了winform实现五子棋游戏的具体代码,供大家参考,具体内容如下利用数组,根据新旧数组值的不同,获取那个点是什么棋子;说
- 使用官方的刷新控件SwipeRefreshLayout来实现下拉刷新,当RecyclerView滑到底部实现下拉加载(进度条效果用Recyc
- 前言:学习过我的mall项目的应该知道,mall-admin模块是使用SpringSecurity+JWT来实现登录认证的,而mall-po
- IDEA自定义pom依赖抽离公共代码,代码解耦,减少重复第一步: 抽离公共部分的代码第二步: 点击右侧工具栏的maven,刷新,点击skip
- 在网上有非常多通过射线方式实现的人物行走控制脚本,可是假设仅仅是想通过键盘按键来控制的话。比方进行第三人称视角控制,事实上仅仅须要进行简单的
- jackson反序列化忽略字段JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有
- 一、概念哈希算法(hash algorithm):是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。哈希表(hash
- Android Studio Intent隐式启动,发短信,拨号,打电话,访问网页等实例代码功能创建5个按钮,隐式启动、发短信、拨号按钮、电
- 每一个app都会有一个”退出登陆”的功能,当点击退出之后需要将所有的Activity都finish掉,开始是想将栈中的所有Activity清
- 前言MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以
- 写应用程序的过程中,弹窗是个避免不了的功能,显示中,假设弹窗背景色和主窗口背景色相差不多,甚至是一样的时候,就会存在一个比较严重的人机交互和
- 完全属于自己的新闻展示平台,展示给大家,希望大家喜欢。一、新闻的数据库的构建脚本代码如下:(使用的mysql5.0 数据库)SET SQL_
- 一、前言最近在加强 ITAEM 团队的一个 app 项目——学生教师学习交流平台人员组成:安卓 + 前端 + 后台后台 DAO 层借鉴了华工
- 1.类的6个默认成员函数默认成员函数:用户没有显示实现,编译器会生成的成员函数称为默认成员函数。如果一个类中什么成员都没有,简称为空类。但空
- 很多时候我们复制一个对象实例A到实例B,在用实例B去做其他事情的时候,会对实例B进行修改,为保证对B的修改不会影响到A的正常使用,就需要使用