热门标签 | 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);}
}

推荐阅读
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
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社区 版权所有