热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线程池的类型及其应用场景

newFixedThreadPool创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将

newFixedThreadPool

创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {// 创建一个可重用固定个数的线程池ExecutorService fixedThreadPool &#61; Executors.newFixedThreadPool(3);for (int i &#61; 0; i < 10; i&#43;&#43;) {fixedThreadPool.execute(new Runnable() {&#64;Overridepublic void run() {try {// 打印正在执行的缓存线程信息System.out.println(Thread.currentThread().getName()&#43; "正在被执行");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}});}}
}

因为线程池大小为3&#xff0c;每个任务输出打印结果后sleep 2秒&#xff0c;所以每两秒打印3个结果。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()


newCachedThreadPool

创建一个可缓存的线程池。这种类型的线程池特点是&#xff1a;


工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。



如果长时间没有往线程池中提交任务&#xff0c;即如果工作线程空闲了指定的时间(默认为1分钟)&#xff0c;则该工作线程将自动终止。终止后&#xff0c;如果你又提交了新的任务&#xff0c;则线程池重新创建一个工作线程。


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {// 创建一个可缓存线程池ExecutorService cachedThreadPool &#61; Executors.newCachedThreadPool();for (int i &#61; 0; i < 10; i&#43;&#43;) {try {// sleep可明显看到使用的是线程池里面以前的线程&#xff0c;没有创建新的线程Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}cachedThreadPool.execute(new Runnable() {&#64;Overridepublic void run() {// 打印正在执行的缓存线程信息System.out.println(Thread.currentThread().getName()&#43; "正在被执行");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});}}
}

线程池为无限大&#xff0c;当执行当前任务时上一个任务已经完成&#xff0c;会复用执行上一个任务的线程&#xff0c;而不用每次新建线程


newSingleThreadExecutor

创建一个单线程化的Executor&#xff0c;即只创建唯一的工作者线程来执行任务&#xff0c;如果这个线程异常结束&#xff0c;会有另一个取代它&#xff0c;保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务&#xff0c;并且在任意给定的时间不会有多个线程是活动的 。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {//创建一个单线程化的线程池ExecutorService singleThreadExecutor &#61; Executors.newSingleThreadExecutor();for (int i &#61; 0; i < 10; i&#43;&#43;) {final int index &#61; i;singleThreadExecutor.execute(new Runnable() {&#64;Overridepublic void run() {try {//结果依次输出&#xff0c;相当于顺序执行各个任务System.out.println(Thread.currentThread().getName()&#43;"正在被执行,打印的值是:"&#43;index);Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}});}}
}

newScheduledThreadPool

创建一个定长的线程池&#xff0c;而且支持定时的以及周期性的任务执行&#xff0c;类似于Timer。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {//创建一个定长线程池&#xff0c;支持定时及周期性任务执行——延迟执行ScheduledExecutorService scheduledThreadPool &#61; Executors.newScheduledThreadPool(5);//延迟1秒执行/*scheduledThreadPool.schedule(new Runnable() {public void run() {System.out.println("延迟1秒执行");}}, 1, TimeUnit.SECONDS);*///延迟1秒后每3秒执行一次scheduledThreadPool.scheduleAtFixedRate(new Runnable() {&#64;Overridepublic void run() {System.out.println("延迟1秒后每3秒执行一次");}}, 1, 3, TimeUnit.SECONDS);}
}

推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
author-avatar
XC一米_623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有