Java中线程池的使用

【网络安全】Centos7安装杀毒软件----ClamAV Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。 阅读详情

一、线程池的作用

线程池的作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;
少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,
其他线程排队等候。一个任务执行完毕,再从队列中取最前面的任务开始执行。
若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,
如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

二、线程池的优点

  • 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
  • 可以根据系统的承受能力,调整线程池中工作线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开得越多,消耗的内存也就越大,最后死机。)

三、Executors

Java 里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而是一个执行线程的工具。真正的线程池接口是ExecutorService。ThreadPoolExecutor 是 Executors 类的底层实现。

线程池创建线程大致可以分为三种:
  • 固定大小连接池
    使用多线程需要实现Runnable 接口对象,这里直接继承Thread 。
    因为Thread也实现了 Runnable 接口
	public class MyThread extends Thread
	{
    	@Override
    	public void run(){
        	System.out.println(currentThread().getName()+" is Running ...");
    	}
	}

	public static void main(String args)
	{
		//创建一个可重用且固定线程数的线程池
		int pool_num = 2 ;
		//固定大小连接池 :不管 execute 执行几次,线程池始终都会使用 pool_num  个线程来处理
		ExecutorService pool = Executors.newFixedThreadPool(pool_num);
		
		// pool_num 等于2 ,我们启动4个线程来测试
		Thread t1 = new MyThread();
		Thread t2 = new MyThread();
		Thread t3 = new MyThread();
		Thread t4 = new MyThread();

		pool.execute(t1);
		pool.execute(t2);
		pool.execute(t3);
		pool.execute(t4);
		
		//关闭线程池
		pool.shutdown();
	}
	

运行结果

pool-1-thread-1 is Running ...
pool-1-thread-1 is Running ...
pool-1-thread-1 is Running ...
pool-1-thread-2 is Running ...

从上面的运行来看,我们 Thread 类都是在线程池中运行的,线程池在执行 execute 方法来执行 Thread 类
中的 run 方法。不管 execute 执行几次,线程池始终都会使用 2 个线程来处理。不会再去创建出其他线程来处理run 方法执行。这就是固定大小线程池。

  • 单任务连接池
	ExecutorService pool = Executors.newSingleThreadExecutor();
	Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    pool.execute(t1);
    pool.execute(t2);

    pool.shutdown();

运行结果

pool-1-thread-1 is Running ...
pool-1-thread-1 is Running ...

不管 execute 执行几次,线程池始终都会使用单个线程来处理。

  • 可变连接池
	    ExecutorService pool = Executors.newCachedThreadPool();
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        Thread t4 = new MyThread();

        //将线程放入线程池中执行
        pool.execute(t1);
        pool.execute(t2);
        pool.execute(t3);
        pool.execute(t4);

        //关闭线程池
        pool.shutdown();

运行结果

pool-1-thread-1 is Running ...
pool-1-thread-2 is Running ...
pool-1-thread-3 is Running ...
pool-1-thread-4 is Running ...

这里 execute 执行多次,线程池就会创建出多个线程来处理 Thread 类中 run 方法。
我们看到连接池会根据执行的情况,在程序运行时创建多个线程来处理,这里就是可变连接池的特点。

四、ExecutorService 执行器服务

java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务。
因此一个 ExecutorService 很类似于一个线程池。实际上,存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现。

//线程工厂类创建出线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
//执行一个线程任务
executorService.execute(new Runnable() {
public void run() {
System.out.println("Asynchronous task");
}
});
//线程池关闭
executorService.shutdown();

上面代码首先使用 newFixedThreadPool() 工厂方法创建一个 ExecutorService。
这里创建了一个固定大小为10的线程执行任务的线程池。然后,将一个 Runnable
接口的匿名实现类传递给 execute() 方法。
这将导致 ExecutorService 中的某个线程执行该 Runnable。
这里可以看成一个任务分派,示例代码中的任务分派我们可以理解为:

  • 一个线程将一个任务委派给一个 ExecutorService 去异步执行。
  • 一旦该线程将任务委派给 ExecutorService,该线程将继续它自己的执行,独立于该任务的执行。
AD17入门简单教程(一) AD17入门简单教程 我写这篇文章主要是因为最近刚学习完了AD17,想做一下总结,也希望通过自己心得的帮助一些刚入门AD17的小白。 总结一共分为两大部分,包括AD17的下载安装与汉化(文末有详细链接)、工程的创建、元器件库、PCB、走线中的常用命令介绍,文末还附有完整的PCB工程以及讲解视频。 第一部分工程的创建及元器件库常用命令 1.首先在桌面上创建一个文件夹,然后在AD17点击左上角的文件中... 阅读详情

相关推荐

尚硅谷课程【笔记】——大数据之Shell【一】

【【尚硅谷】Shell脚本从入门到实战】笔记

n04j04h06的博客 1318

Java/ExecutorService中多线程服务ExecuteService的使用

ExecutorService 是 Java 中的一个接口,它扩展了 Executor 接口,并提供了更多的方法来处理多线程任务。它是 Java 中用于执行多线程任务的框架之一,可以创建一个线程池,将多个任务提交到线程池中执行。ExecutorService 接口提供了许多方法,如 shutdown()、shutdownNow()、submit()、execute()、invokeAll() 等,可以更方便地提交任务、执行任务、关闭线程池等操作。

★【World Of Moshow 郑锴】★ 4458

科研作图不发愁:手把手教你用PyMOL给蛋白-DNA互作图‘美颜’(附完整配色与标注方案)

本文详细介绍了如何使用PyMOL对蛋白-DNA互作结构图进行专业美化,包括从PDB文件加载、结构展示与标注、互作位点突出显示到高质量渲染输出的完整流程。通过具体案例(PDB ID:8SSS)演示了锌指结构域区分、关键残基标注和互作距离测量等实用技巧,帮助科研人员制作可直接用于期刊投稿的高质量示意图。

weixin_42523792的博客 552

常用线程池介绍

线程池简介 1.线程池概念: 线程池是首先创建一个线程,它们的集合成为线程池。使用线程池可以很好的提升性能,线程池在启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行线程完成后,该线程不会死亡,而是返回线程池中成为空闲状态,等待执行下一个任务。 2.线程池的工作机制 2.1在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。 2.2一个线程同时只能执行一个任

NewBie_xW的博客 1055

ROS水下仿真神器uuv_simulator:从零搭建水下机器人测试环境(附Gazebo配置全流程)

本文详细介绍了如何使用ROS和uuv_simulator从零搭建水下机器人仿真测试环境,包括Gazebo配置全流程。通过系统环境准备、水下世界构建、机器人模型定制开发等步骤,帮助开发者在虚拟海洋环境中高效验证算法,大幅降低研发成本。特别适合水下机器人研发人员参考。

ujm5678901的博客 262

【随机过程】 3 - 随机过程的频域分析1 - 功率谱

随机过程的频域分析 文章目录随机过程的频域分析1. 什么是谱2. 确定信号的频谱2.1 周期信号的频谱2.2 非周期信号的频谱3. 随机信号的谱3.1 随机信号做傅里叶分析的困难3.2 功率谱密度的物理和数学表示形式3.2.1 功率谱密度的物理表示3.2.2 功率谱密度的数学表示3.3 功率谱密度的解读3.3.1 量纲分析3.3.2 谱3.3.3 密度3.3.4 wiener和khinchin3.4 功率谱密度的性质3.4.1 非线性3.4.2 偶函数3.5 wiener-khinchin关系的应用3.6

qq_41741344的博客 3131

线程池的5种使用方式

池化思想,不同线程池的创建方式以及差别,线程数设置的经验

a141210104的专栏 6137

SAP_PP模块中MRP中信号灯简介

一、信号灯的作用二、常见的信号灯颜色及含义三、信号灯的来源四、常见场景示例示例1:物料满足所有需求示例2:生产订单已延迟示例3:缺料或未产生计划订单五、相关事务码参考六、如何应对红色或黄色信号灯?七、前台操作说明在 SAP PP 模块中,**MRP(物料需求计划)运行结果中的“信号灯”是一种非常直观的可视化提示工具,用于帮助用户快速识别物料计划是否存在异常或需要关注的问题。这些信号灯通常出现在MD04(库存/需求清单)、MD05(单物料MRP清单)、MD07(MRP列表)**等事务代码的界面中。

我小时候很黑的博客 624

线程池的使用

java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。java中涉及到线程池的相关类均在jdk1.5开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、F

xiaowang_lj的博客 6099

实用指南:制作通用的INCA和CANape兼容A2L文件

A2L(ASAM MCD-2 Measurement and Calibration Data)文件是描述ECU(电子控制单元)测量和校准数据的标准文件格式。在标定工作中,A2L文件扮演着极为重要的角色,它定义了测量通道、校准参数等关键信息,为工程师提供了统一的描述方式。INCA和CANape是两种常见的汽车电子系统标定工具,分别由ETAS和Vector公司开发。它们在汽车电子系统的开发和调试过程中发挥着重要作用,提供了丰富的标定功能和用户友好的界面。

一直在水些技术小文 2922

基于Python的MOOC课程评价爬取与分析系统设计与实现

本文详细介绍了如何使用Python最新技术栈构建一个高效的MOOC课程评价爬取与分析系统。系统采用Scrapy框架结合Selenium实现动态页面抓取,利用PyMySQL进行数据存储,并通过Pandas和Matplotlib实现数据可视化分析。文章从爬虫原理、技术选型、系统设计到代码实现进行全面讲解,为教育工作者改进教学质量提供数据支持。关键词:Python爬虫、MOOC评价分析、Scrapy框架、数据可视化、教学改进。

2201_76125261的博客 1103

Java中线程池

目录 一、概述 二、Runnable 接口 三、Callable 接口 一、概述 在Java中,创建和销毁线程花费的时间和消耗的系统资源都是相当大的,甚至可能要比在处理实际用户请求的时间和资源要多的多,除了创建和销毁线程的开销之外,活动的线程也需要消耗资源。如果在一个JVM中创建太多的线程,可能会使系统由于过度消耗内存或切换过度而导致系统资源不足,为了防止资源不足,需要采取一些办法来限制...

ONESTARの博客 2361

ArcGIS Pro 3.4 二次开发 - 地理数据库

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下,如何操作地理数据库的多种方法。首先,通过路径打开文件地理数据库,并处理可能出现的异常。其次,使用连接属性或sde文件路径打开企业级地理数据库。此外,还展示了如何从项目项、要素图层中获取地理数据库,以及如何执行SQL语句。最后,文章详细说明了如何从地理数据库中获取单个定义或定义列表,包括表定义、要素类定义、关系类定义和要素数据集定义。这些操作均在后台线程中执行,确保应用程序的响应性。

Winemonk 944

java中线程池

java中线程池

zhouguizhi 817

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JAVA中线程池ThreadPoolExecutor的使用

线程池,就是有一定数量线程的池子,池子中的线程可以多次使用,这可以减少创建和销毁线程的次数,从而达到节约运行时间和系统资源的目的。ThreadPoolExecutor是Java中的一个ExecutorService。

Zerol_Yan的博客 1064

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java中线程池的技术

🌞博主介绍:✌优快云特邀作者、985计算机专业毕业、某互联网大厂高级全栈开发程序员、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导、面试辅导、简历修改。✌🌞👇🏻精彩专栏 推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐✅。

wishcoding的博客 453

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java中线程池创建方式

在Java中,线程池是一种用于管理和复用线程的机制,可以有效地提高应用程序的性能和资源利用率。Java提供了`java.util.concurrent`包中的`ExecutorService`接口和`Executors`工具类来实现线程池。以下是几种常见的线程池实现方法,包括代码示例和表格对比。

爱的叹息的专栏 725

Java 中线程池的 7 种创建方式!

在 Java 语言中,并发编程都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景,总体来说线程池的创建可以分为以下两类: 通过 ThreadPoolExecutor 手动创建线程池。 通过 Executors 执行器自动创建线程池。 而以上两类创建线程池的方式,又有 7 种具体实现方法,这 7 种实现方法分别是: Executors.ne...

qc 1万+

Java中线程池的创建方式有几种?

Executors类:提供了方便的静态工厂方法来创建常见类型的线程池。: 固定大小线程池。: 可缓存的线程池。: 单线程池。: 定时线程池。类:提供了高度可配置的线程池实现,可以精细控制线程池的行为。类:用于并行处理大量小任务,特别是递归任务。根据应用程序的需求选择合适的线程池实现,可以显著提高性能并简化多线程编程。

宋发元 1306

java中线程池的使用_Java中线程池的简单使用

什么是线程池?顾名思义线程池就是线程的容器举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源;但是现在共享电源出现了,假设车站现在一共有3个共享移动电源,那么其中三个人只需要花一块钱租共享移动电源充电,后面2个人等前面的人用完了,接着花1块钱租就可以了(这个例子的前提是这5个人都不赶时间的前提下)这里的共享电源...

weixin_39890452的博客 323

Java中线程池简介

Java中线程池简介1 常见的四种创建线程池方法1 newFixedThreadPool(固定大小的线程池)2 newCachedThreadPool(可缓存的线程池)3 newSingleThreadExecutor(单线程的线程池)4 newScheduledThreadPool(定时及周期性任务的线程池)2 ThreadPoolExecutor类创建线程池1 ThreadPoolExecutor常用构造方法2 线程池参数说明1 workQueue2 threadFactory3 handler3 线程

ABestRookie的博客 286

Java中线程池的创建与使用

java 线程池

zlfjavahome的专栏 766
上一篇: 如何理解Java Clone对象
下一篇: SpringMVC的工作原理和常用注解
_干柿鬼鲛
博客等级 码龄9年 27粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值