Java四种线程池的使用详解

发布时间 - 2026-01-11 03:02:31    点击率:

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

(1) newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  try { 
  Thread.sleep(index * 1000); 
  } catch (InterruptedException e) { 
  e.printStackTrace(); 
  } 
  cachedThreadPool.execute(new Runnable() { 
  public void run() { 
   System.out.println(index); 
  } 
  }); 
 } 
 } 
} 

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

(2) newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  fixedThreadPool.execute(new Runnable() { 
  public void run() { 
   try { 
   System.out.println(index); 
   Thread.sleep(2000); 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
 } 
 } 
}

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()

(3)  newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

package test; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 
 scheduledThreadPool.schedule(new Runnable() { 
  public void run() { 
  System.out.println("delay 3 seconds"); 
  } 
 }, 3, TimeUnit.SECONDS); 
 } 
} 

表示延迟3秒执行。

定期执行示例代码如下:

package test; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 
 scheduledThreadPool.scheduleAtFixedRate(new Runnable() { 
  public void run() { 
  System.out.println("delay 1 seconds, and excute every 3 seconds"); 
  } 
 }, 1, 3, TimeUnit.SECONDS); 
 } 
} 

表示延迟1秒后每3秒执行一次。

(4) newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  singleThreadExecutor.execute(new Runnable() { 
  public void run() { 
   try { 
   System.out.println(index); 
   Thread.sleep(2000); 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
 } 
 } 
} 

结果依次输出,相当于顺序执行各个任务。

你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:

工具目录:C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe

运行程序做稍微修改:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService singleThreadExecutor = Executors.newCachedThreadPool(); 
 for (int i = 0; i < 100; i++) { 
  final int index = i; 
  singleThreadExecutor.execute(new Runnable() { 
  public void run() { 
   try { 
   while(true) { 
    System.out.println(index); 
    Thread.sleep(10 * 1000); 
   } 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
  try { 
  Thread.sleep(500); 
  } catch (InterruptedException e) { 
  e.printStackTrace(); 
  } 
 } 
 } 
} 

效果如下:

选择我们运行的程序:

监控运行状态

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java线程池  # java多线程池  # java中的线程池  # 一篇文章带你了解如何正确使用java线程池  # java多线程教程之如何使用线程池详解  # Java线程池中的各个参数如何合理设置  # Java中四种线程池的使用示例详解  # JAVA多线程的使用场景与注意事项总结  # java线程池不同场景下使用示例经验总结  # 定长  # 创建一个  # 第一个  # 会在  # 会用  # 若无  # 它只  # 单线程  # 你可以  # 第二个  # 分别为  # 自带  # 四种  # 大家多多  # 复用  # 运行状态  # 系统资源  # index  # static  # ExecutorService 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 动图在线制作网站有哪些,滑动动图图集怎么做?  网站建设保证美观性,需要考虑的几点问题!  微信小程序 input输入框控件详解及实例(多种示例)  Java垃圾回收器的方法和原理总结  如何在Windows 2008云服务器安全搭建网站?  phpredis提高消息队列的实时性方法(推荐)  实例解析angularjs的filter过滤器  浅谈Javascript中的Label语句  Laravel怎么实现模型属性的自动加密  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何在云主机上快速搭建多站点网站?  详解vue.js组件化开发实践  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何自定义建站之星模板颜色并下载新样式?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何快速搭建FTP站点实现文件共享?  如何在阿里云完成域名注册与建站?  EditPlus中的正则表达式 实战(1)  微信h5制作网站有哪些,免费微信H5页面制作工具?  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何在IIS中新建站点并配置端口与IP地址?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  香港服务器租用每月最低只需15元?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  做企业网站制作流程,企业网站制作基本流程有哪些?  Laravel如何生成URL和重定向?(路由助手函数)  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  制作企业网站建设方案,怎样建设一个公司网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  googleplay官方入口在哪里_Google Play官方商店快速入口指南  如何在阿里云通过域名搭建网站?  香港服务器租用费用高吗?如何避免常见误区?  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel如何配置Horizon来管理队列?(安装和使用)  Java遍历集合的三种方式  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  黑客入侵网站服务器的常见手法有哪些?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  BootStrap整体框架之基础布局组件  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  百度浏览器如何管理插件 百度浏览器插件管理方法  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  微信公众帐号开发教程之图文消息全攻略  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试