深入剖析Java线程池之“newWorkStealingPool“

1. 概述

newWorkStealingPool 是Java 8中引入的一个新型线程池,它基于ForkJoinPool实现,并采用了“工作窃取”(Work-Stealing)算法。这种线程池特别适用于可并行化且计算密集型的任务,能够充分利用多核CPU资源,提高任务执行效率。


2. 工作窃取算法(Work-Stealing Algorithm)

newWorkStealingPool中,每个线程都维护一个自己的任务队列(双端队列Deque)。当线程执行完自己队列中的任务后,它会尝试从其他线程的队列中“窃取”任务来执行,从而实现负载均衡。这种算法能够减少线程间的竞争,提高系统的整体性能。


3. 源码分析

newWorkStealingPool的源码实现主要依赖于ForkJoinPool类。

3.1 ForkJoinPool 的创建

当使用 ForkJoinPool 的构造器创建一个新的线程池时,会指定几个关键参数:

  • parallelism:并行级别,即线程池中的线程数量。
  • Factory:用于创建新线程的工厂。
  • UncaughtExceptionHandler:用于处理未捕获异常的处理器。
  • 其他参数(如异步模式、线程工厂参数等)。

3.2 工作队列(WorkQueue)

每个 ForkJoinWorkerThreadForkJoinPool 中的工作线程)都有一个与之关联的工作队列(通常是一个双端队列,如 Deque)。这个队列用于存储待执行的任务。

3.3 工作窃取算法

工作窃取算法是 ForkJoinPool 的核心。当某个工作线程完成了其工作队列中的所有任务时,它会尝试从其他工作线程的工作队列中“窃取”任务。这个过程通常涉及以下几个步骤:

  1. 随机选择:工作线程随机选择一个其他工作线程作为“窃取”的目标。
  2. 检查并窃取:工作线程检查目标线程的工作队列,如果队列不为空,则尝试从中“窃取”一个任务。窃取通常意味着从队列的尾部移除一个任务。
  3. 执行窃取到的任务:如果成功窃取到任务,则工作线程将执行该任务。
  4. 重复:如果工作线程仍然有空闲时间,它将重复上述过程,尝试从其他线程的工作队列中窃取任务。

3.4 任务拆分与合并

除了工作窃取外,ForkJoinPool 还支持任务的拆分与合并。这意味着可以编写可以拆分为更小子任务的任务,并在所有子任务都完成后合并它们的结果。这通过实现 RecursiveActionRecursiveTask 接口来完成。

3.5 源码实现细节

在 JDK 的源码中,ForkJoinPoolForkJoinWorkerThread 和相关类的实现将涉及复杂的并发控制和算法优化。这些实现细节通常包括:

  • 高效的工作队列操作,以确保线程安全且性能良好。
  • 精细的负载平衡算法,以确保工作线程之间的负载分布均匀。
  • 对异常处理和线程生命周期的精细控制。
  • 可能的性能优化,如缓存局部性优化和减少线程上下文切换的开销。

4. 示例

假设有一个大规模的图像处理任务,需要对数千张图片进行滤镜效果处理。每张图片的处理过程都是独立的,且计算密集型。这时,可以使用newWorkStealingPool来并行处理这些任务。

4.1 实例1:使用无参构造

ExecutorService executor = Executors.newWorkStealingPool();  
List<Future<?>> futures = new ArrayList<>();  for (Image image : images) {  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

618狂欢日,美味产品齐上阵,超值优惠等你享

这个充满激情与活力的6月&#xff0c;我们带着满满的诚意与惊喜&#xff0c;为广大美食爱好者们开启一场独特的618狂欢之旅。 当我们提及甘肃&#xff0c;那丰富多样的甘肃传统美食便是不得不说的瑰宝。烤馍&#xff0c;油饼&#xff0c;锅盔、擀面皮、浆水等每一种美食都…

java算法:插入排序

这里写目录标题 基本使用优缺点尝试优化二分查找插入减少交换操作 基本使用 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理是将待排序的数组分为已排序和未排序两部分&#xff0c;逐步将未排序部分的元素插入到已排序部分中的正确位置&#xff0c;直到整个数组有…

ffmpeg的部署踩坑及简单使用方式

ffmpeg的使用方式有以下几种: 使用原生安装包 直接在ffmpeg官网上下载安装该软件,加入到环境变量中就可以使用了 优点:简单,灵活,代码中也不用添加其他第三方的包 缺点:需要手动安装ffmpeg,这点比较麻烦 部署-windows 在windows环境下,有时就算加入到了环境变量,…

你知道花洒其实起源于中国古代吗?

花洒作为日常生活中不可或缺的一部分&#xff0c;其发展历程不仅见证了人类文明的进步&#xff0c;也反映了生活美学的演变。从最初的简单构想到现代的智能化设计&#xff0c;花洒的变迁历程是一部生动的人类生活史。 早在隋朝时期&#xff0c;我们的祖先就已经有了花洒的初步构…

【Go语言】Go语言中的接口类型

Go语言中的接口类型 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具体的对象来实现规范的细节。 1.接口类型 1.1 接口类型的说明 Go语言中 接口&#xff08;interface&#xff09; 是一种抽象的类型。 接口…

《纪元 1800》好玩吗? 苹果电脑能玩《纪元 1800》吗?

《纪元1800》是一款不错的策略游戏&#xff0c;这款游戏因为画面和玩法独特深受玩家们的喜爱。下面我们来看看《纪元 1800》好玩吗&#xff0c;苹果电脑能玩《纪元 1800》吗的相关内容。 一、《纪元1800》好玩吗 《纪元1800》是一款备受瞩目的策略游戏。下面让我们来看看这款…

初探工厂抽象模式

设计模式的-工厂模式 1.定义一个约定的规则抽象类 class ETFactory {createStore() {throw new Error(抽象方法&#xff0c;不允许直接调用&#xff0c;需重写)}createUser(){throw new Error(抽象方法&#xff0c;不允许直接调用&#xff0c;需重写)} } 案例&#xff1a;…

eNSP学习——OSPF在帧中继网络中的配置

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、在帧中继上搭建OSPF网络 主要命令 //检查帧中继的虚电路状态 display fr pvc-info//检查帧中继的映射表 display fr map-info//手工指定OSPF邻居,采用单播方式发送报文 [R1]os…

数据溢出导致的pthread_cond_timedwait工作异常

struct timespec ts; int rc; clock_gettime(CLOCK_MONOTONIC, &ts); ts.tv_nsec 300000000;//tv_nsec的最大值是999999999&#xff0c;这里直接加300毫秒&#xff0c;大概率会溢出&#xff0c;如果溢出应该把ts.tv_sec加1。 pthread_mutex_lock(&mutex_data_); …

Android Compose 文本输入框TextField使用详解

一、 TextField介绍 TextField 允许用户输入和修改文本&#xff0c;也就是文本输入框。 TextField 分为三种&#xff1a; TextField是默认样式OutlinedTextField 是轮廓样式版本BasicTextField 允许用户通过硬件或软件键盘修改文本&#xff0c;但不提供提示或占位符等装饰&a…

youlai-boot项目的学习—本地数据库安装与配置

数据库脚本 在项目代码的路径下&#xff0c;有两个版本的mysql数据库脚本&#xff0c;使用对应的脚本就安装对应的数据库版本&#xff0c;本文件选择了5 数据库安装 这里在iterm2下使用homebrew安装mysql5 brew install mysql5.7注&#xff1a;记得配置端终下的科学上网&a…

京准电钟 | NTP网络时间同步协议原理及其应用介绍

京准电钟 | NTP网络时间同步协议原理及其应用介绍 京准电钟 | NTP网络时间同步协议原理及其应用介绍 摘 要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的 应用与发展,最后指出时间同步网络在下一代网络(NGN) 中的重要地位。 随着…

Linux--(三)MQTT协议参数

一、QoS QoS 是 Quality of Service 的缩写&#xff0c;所以中文名便是服务质量。一个物联网通信中有些信息非常重要&#xff0c;我们需要确保这类重要信息可以准确无误的发送和接收&#xff0c;而有些信息则相对不那么重要&#xff0c;这类信息如果在传输中丢失不会影响系统…

实时工业数据采集分析系统高效处理产线信息!

对于大部分制造业企业&#xff0c;测量仪器的自动数据采集一直是个令人烦恼的事情&#xff0c;即使仪器已经具有RS232/485等接口&#xff0c;但仍然在使用一边测量&#xff0c;一边手工记录到纸张&#xff0c;再输入到PC中处理的方式&#xff0c;不但工作繁重&#xff0c;同时也…

try catch return语句情况分析

try catch return语句情况分析 try catch无finally语句写在最后 try catch try catch语法是一种对应于异常处理的语句&#xff0c;其中try语句内用于编写有异常存在可能的语句&#xff0c;而catch语句内用于编写捕获到异常的类型以及对异常对象的处理方法&#xff0c;本文主要…

鸿蒙: 基础认证

先贴鸿蒙认证 官网10个类别总结如下 https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 10节课学习完考试 考试 90分合格 3次机会 1个小时 不能切屏 运行hello world hvigorfile.ts是工程级编译构建任务脚本 build-profile.json5是工程…

IPA清洁棉签 IPA清洁擦拭棒:打印机头、电子设备等清洁的有力工具!

在数字化快速发展的今天&#xff0c;打印机头、电子设备等已经成为了我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着使用时间的增长&#xff0c;这些设备往往会因为灰尘、油渍等污染物的积累而影响其性能。此时&#xff0c;一款高效、便捷的清洁工具就显得尤为重…

Antdv 备忘

www.antdv.com 1. <a-select 默认选中&#xff1a; <a-select :value"refreshInterval" 2.使用Drawer (单独页面方式) <template> <a click"changeTheme" style"padding-right: 20px">切换主题</a> <SettingD…

数据预处理之基于聚类的TOD异常值检测#matlab

1.基于聚类的异常值检测方法 物以类聚——相似的对象聚合在一起&#xff0c;基于聚类的异常点检测方法有两个共同特点&#xff1a; (1)先采用特殊的聚类算法处理输入数据而得到聚类&#xff0c;再在聚类的基础上来检测异常。 (2)只需要扫描数据集若干次&#xff0c;效率较高…

3D Gaussian Splatting Windows安装

1.下载源码 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 2.安装cuda NVIDIA GPU Computing Toolkit CUDA Toolkit Archive | NVIDIA Developer 3.安装COLMAP https://github.com/colmap/colmap/releases/tag/3.9.1 下载完成需要添加环…