计算程序所需线程总数 -- 摘自《Java虚拟机并发编程》

Java并发编程实战:掌握多线程编程的交错优化和高效实践 Java并发编程是一项非常重要的技术,在现代计算机系统中广泛应用。掌握Java并发编程的基本原理和实践技巧,可以帮助我们更好地编写高性能的多线程程序。本文介绍了Java并发编程的基本原理和实践技巧,包括线程和进程、同步和互斥、线程间的通信、线程池等方面的内容。希望读者通过本文的介绍,可以更好地理解Java并发编程,并能够在实践中应用这些知识。 阅读详情
计算程序所需线程总数:
线程数 = CPU可用核心数/(1-阻塞系数)

其中阻塞系数的取值在0-1之间。

计算密集型任务的阻塞系数为0,而IO密集型任务的阻塞系数则接近于1。一个完全阻塞的任务是注定要挂掉的,所以我们无须担心阻塞系数会达到1。

为了更好的确定程序所需线程数,我们需要知道下面两个关键参数:
1、处理器可用核心数

2、任务的阻塞系数

第一个参数很容易确定(Runtime.getRuntime().availableProcessors())。

阻塞系数可以采用一些性能分析工具或java.lang.managenment API来确定线程话在系统I/O操作上的时间与CPU密集任务所消耗的时间比值。

Demo:

	// 测试公式:线程数=CPU可用核心数/(1-阻塞系数)
	@Test
	public void testInvokeAll() throws InterruptedException, ExecutionException {
		// 向 Java 虚拟机返回可用处理器的数目(我当前机器是i3双核四线程,返回为4)
		int numberOfCores = Runtime.getRuntime().availableProcessors();
		double blockingCoefficient = 0;
		int poolSize = (int) (numberOfCores / (1 - blockingCoefficient));
		System.out.println("poolSize:" + poolSize);

		// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程
		ExecutorService services = Executors.newFixedThreadPool(poolSize);

		List<Callable<String>> tasks = new LinkedList<Callable<String>>();
		for (int i = 10; i >= 1; i--) {
			final String reStr = "current call " + i;
			final int j = i;

			tasks.add(new Callable<String>() {

				@Override
				public String call() throws Exception {
					// 模拟阻塞
					TimeUnit.SECONDS.sleep(j);
					return reStr;
				}
			});
		}

		long beginTime = System.currentTimeMillis();

		List<Future<String>> invokeValues = services.invokeAll(tasks);

		System.out.println("time:" + (System.currentTimeMillis() - beginTime));

		Iterator<Future<String>> iter = invokeValues.iterator();
		while (iter.hasNext()) {
			System.out.println(iter.next().get());
		}

		services.shutdown();
	}
当我们阻塞系数设置为0,消耗时间为15003;阻塞系数设置为0.9时,消耗时间为10001。

poolSize:4
time:15003
current call 10
current call 9
current call 8
current call 7
current call 6
current call 5
current call 4
current call 3
current call 2
current call 1

poolSize:40
time:10001
current call 10
current call 9
current call 8
current call 7
current call 6
current call 5
current call 4
current call 3
current call 2
current call 1

Java并发编程基础小结 并发编程的核心问题与解决方案 本文从多线程的必要性、优势入手,深入分析了并发编程需要关注的三大核心问题:安全性问题(如数据竞争)、活跃性问题(如死锁、活锁)以及性能问题(如线程切换开销)。作者通过生动的代码示例和图示,展示了在多线程环境下可能出现的典型问题,并指出JVM中线程与进程的资源分配差异。文章还解释了程序计数器、虚拟机栈等线程私有区域的设计原理,以及如何利用"栈封闭"技术解决线程安全问题。全文为Java开发者提供了对并发编程本质问题的系统性思考框架。 阅读详情

相关推荐

C++时间复杂度分析

如果想要知道一个程序运行需要花费多少时间,直接运行测试不是更简单更准确吗?何必去花精力推算复杂度!首先,这个想法没问题,确实可以直接跑出来,但这属于马后炮,无法提前预估算法的时间复杂度,而且也非常受限:1、测试结果在不同处理器上运行的结果会有很大波动2、即使在同一环境下运行,不同数据也会导致结果有很大波动所以需要一个不用具体测试就能评估程序执行效率的方法,也就是时间、空间复杂度分析方法。

hls0611的博客 3847

Java并发(八)计算线程池最佳线程数

目录   一、理论分析   二、实际应用 为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间...

dlx29376的博客 576

深入解析PVT corner:从wcl到ml的芯片设计关键考量

本文深入解析了芯片设计中的PVT corner概念,重点探讨了从传统WC到先进工艺下WCL、ML等关键工艺角。文章详细阐述了温度反转效应如何使低温WCL成为最严苛的时序场景,并提供了基于先进工艺的实战签核策略与多角多模分析流程,确保芯片在极端工艺、电压、温度下的稳健性。

tree8的博客 530

别再纠结线程池大小 + 线程数量了,没有固定公式的!

可能很多人都看到过一个线程数设置的理论:不会吧,不会吧,真的有人按照这个理论规划线程数?线程数和CPU利用率的小测试抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解): 一个CPU核心,单位时间内只能执行一个线程的指令那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。来写个死循环空跑的例子验证一下:测试环境:AMD Ryzen 5 3600, 6 - Core, 12 - Threads 运行这个例子后,来看看现在CPU的利用率: 从图上可以看到,我的

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 325

AI 辅助代码审查:开启代码质量管控的智能时代

AI辅助代码审查正在改变传统的代码质量管控方式。通过自动化分析、智能反馈和上下文感知,AI不仅提高了代码审查的效率,还提升了代码质量的一致性和可维护性。随着机器学习和深度学习技术的不断发展,未来AI将成为开发者日常工作中强大的助手,进一步推动软件开发向智能化、自动化方向发展。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 3229

别再只玩积木了!用乐高EV3和官方软件,手把手教你做个能巡线的小车(附完整代码)

本文详细介绍了如何利用乐高EV3套件和官方软件制作智能巡线机器人,从硬件组装到软件编程全面覆盖。通过传感器原理讲解、控制算法调试等工程化细节,帮助读者掌握机器人开发的核心理念,特别适合STEAM教育和硬件编程爱好者实践。

weixin_30776273的博客 454

java线程池最大线程数_Java并发(八)计算线程池最佳线程数

目录一、理论分析二、实际应用为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换)。但是有一个很大的问题...

weixin_30045055的博客 2344

导带、价带

价带是电子的“束缚态”能量区间,决定材料的化学性质;导带是电子的“自由态”能量区间,直接决定材料的导电能力;禁带宽度则是区分金属、半导体与绝缘体的核心参数。通过调控能带结构(如掺杂、应变工程),可设计出具有特定电学和光学特性的功能材料,推动电子信息、能源转换等领域的技术革新。

weixin_51552564的博客 5120

vCPU估算的几个基本概念

物理CPU数量:实际服务器插槽上的CPU个数; 核:一块CPU上面能处理数据的芯片组的数量; 超线程:在一个实体芯片组中提供两个逻辑线程; 逻辑CPU数量:物理CPU数量*核*超线程(若支持超线程,该值为2); vCPU:虚机分配的CPU,一个服务器或集群可分配的vCPU数量为为 (逻辑CPU数量 - (控制台需要的逻辑cpu数量))× 虚拟化比例因子(考虑过载,预估为1.2~1.5) ...

Fred's Note 9688

STM32(HAL库)驱动HC-SR04测距模块

本文介绍通过STM32F103C8T6单片机对HC-SR04测距模块进行驱动,并且通过串口对数据进行打印。

weixin_44597885的博客 2205

最新Python爬虫实战(入门爬虫篇)——案例3:爬取二次元cos图片批量下载到本地(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了二次元图片的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖“请求列表页→提取详情页URL→请求详情页→提取图片链接→保存图片”的完整流程,与豆瓣案例的核心逻辑和格式完全对齐。学习重点包括:抓包工具定位多层级数据源、正则表达式匹配复杂链接、模拟请求头绕过反爬机制、文件名安全处理及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践,帮助学习者掌握多层级页面爬取的核心逻辑。

努力让自己发光,对的人才能迎着光而来 14万+

一、多线程基础知识

程序、进程、线程、纤程 ● 什么是程序 ○ 可执行文件,例如(QQ.EXE) ● 什么是进程 ○ 进程是资源的分配的基本单位 ● 什么是线程 ○ 线程是调度执行的基本单位 ○ 多个线程共享同一个进程的资源 ○ 线程的切换是需要消耗资源的 ● 什么是协程/纤程 ○ 是一种最轻量化的线程(lightweight threads)。它是一种用户线程(user thread),让应用程序可以独立决定自己的线程要如何运作。操作系统内核不能看见它,也不会为它进行调度。就像一般的线程,纤程有自己的寻址空间。但是纤程采取合

weixin_43757849的博客 525

OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?

本文介绍了通过相机图像测算物体实际尺寸的方法,重点分析了传感器参数与成像质量的关系。文章首先给出了物体实际尺寸的计算公式,涉及像素尺寸、距离、分辨率等参数。然后详细解析了传感器尺寸与像元尺寸的关系,指出相同分辨率下更大的传感器能获得更好的成像质量。此外还介绍了光学尺寸、像素尺寸对成像的影响,以及帧率的概念。最后提及了相机标定的重要性,并概述了从像素坐标系转换到世界坐标系的基本思路。这些知识为通过相机图像进行精确测量提供了理论基础。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1339

Java的心脏:深入解析Java虚拟机、进程与线程的精妙互动

进程(Process)和线程(Thread)是操作系统中非常基础且重要的概念,它们对于理解程序的执行、资源分配和并发编程至关重要。我将从操作系统(OS)和Java编程语言的角度来详细解释这两个概念。

2401_83707780的博客 1542

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【并发编程六:Java中的线程池(3)-线程池的应用】

【并发编程六:Java中的线程池(3)-线程池的应用】

weixin_43333483的博客 1052

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Java 并发编程】详解

在并发编程中,使用普通的集合类(如 ArrayList、HashMap 等)往往会出现线程安全问题,因为它们在设计时并没有考虑多线程并发访问的情况。Java 提供了一系列并发容器来解决这个问题,这些并发容器在保证高效性能的同时,能够支持多线程安全地进行读写等操作。

架构师之路 1123

怀旧版电脑GBC模拟器

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

Java并发编程实践

并发编程是指通过设计和实现多线程程序来利用计算机资源和提高程序执行效率的编程方法。它的主要特点是多线程之间的竞争和协作关系。线程安全性是指并发编程中,在多个线程访问共享数据时,对数据的访问不会产生意料之外的后果。实现线程安全性需要从数据的状态变化过程进行分析,并采用相应的线程安全策略。

BXA 3000

【JAVA】一文掌握Java并发编程

Java 开发中,并发编程属于相当重要的一个知识点,可以说,Java 的并发能力,是成就今日 Java 地位的因素之一。Java 的并发编程由浅入深实质上是包含 Java(API)层、JVM(虚拟机)层、内核(操作系统)层和 CPU 层。本文从原理上,由浅入深的解释 Java 并发原理。掌握并发原理,才能更好地使用 Java 并发编程!

一个天蝎座的程序猿 1043

Java并发编程实战 Day 1:Java并发编程基础与线程模型

欢迎来到为期30天的《Java并发编程实战》系列教程。本系列将从Java并发编程的基础知识讲起,逐步深入到高级特性与实战应用,帮助开发者构建高性能、可扩展的并发系统。作为开篇第一天,我们将聚焦于Java并发编程基础与线程模型,重点包括以下内容:通过今天的学习,您将掌握如何在Java中高效地管理多线程任务,并为后续更复杂的并发编程打下坚实基础。线程是操作系统调度的最小单元,一个进程中可以包含多个线程,每个线程都有独立的执行路径。Java语言内置了对多线程的支持,使得开发者可以轻松实现并发程序。| 特性 | 进

在未来等你的专栏 1048

HIT软件构造 第十章 并发编程 进程 线程 线程安全

名词解释 进程(Process)和线程(thread):并发编程的两个基本单元。进程:(1)和同一个机器上的其他进程是彼此隔离的。(2)拥有私有的内存空间,运行时不能共享变量。(3)通过IPC(pipe/socket)进行通信。线程:(1)共享所在进程的内存空间(2)共享可变对象的共享时,需要同步(使用synchronization关键字维护线程安全)。(3)有独立的运行时栈,就像一个普通的函数...

陈泊舟的博客 3992

Java并发编程从零到精通

使用ThreadPoolExecutor可以创建自定义的线程池,控制线程池的行为。ThreadPoolExecutor executor = new ThreadPoolExecutor(2 , // 核心线程数 5 , // 最大线程数 60 , TimeUnit . SECONDS , // 空闲线程存活时间 new ArrayBlockingQueue < >(10) , // 工作队列 new ThreadPoolExecutor . CallerRunsPolicy() // 拒绝策略);

qq_38830315的博客 1083

Java并发编程--基础知识(进程,线程,多线程,死锁)

进程 (Process)在计算机中,每个进程都有自己独立的内存空间,包括代码、数据和堆栈等,同时拥有一组系统资源,如文件描述符、信号、处理器状态等。线程 (Thread)

weixin_64451672的博客 690

Java并发:线程池如何设置线程数

目录   一、理论分析   二、实际应用 为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换)。 但是有一个很大的问题摆在我们面前,即我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程。.

chuixue24的博客 2052

【Java 并发编程】初识多线程

到目前为止,我们学到的都是有关 “顺序” 编程的知识,即程序中所有事物在任意时刻都只能执行一个步骤。例如:在我们的 main 方法中,都是多个操作以 “从上至下” 的顺序调用方法以至结束的。虽然 “顺序” 编程能够解决相当大的一部分问题,但是当所有的方法全部推在一个 “队列” 里面,如果前面的方法没有执行完,后面的方法就轮不到。这样程序的运行效率必然十分低下。对于一些问题,能够同时执行程序的多个部分,就会十分方便且必要。而并发编程的设计就是为了专门解决这一类问题。

2301_79201049的博客 1020

Java 中的线程与进程:并发编程的全面指南

进程是操作系统分配资源和调度执行的基本单位。每个进程拥有独立的内存空间、资源(如文件句柄、网络连接)和执行上下文。进程之间是隔离的,通信需要通过特定的机制,如进程间通信(IPC),例如管道或套接字。在 Java 中,一个运行的 Java 应用程序通常是一个 JVM 进程,包含程序代码、数据和运行时环境。线程是进程内的执行单元,是比进程更轻量级的调度单位。多个线程共享进程的内存空间和资源,但每个线程有自己的程序计数器、栈和局部变量。线程之间的通信更直接,因为它们可以直接访问共享内存。

静水深流 1199
上一篇: 《partner4java 讲述 java基础》之第一步:list 、set 、map 粗浅性能对比分析
下一篇: Java开发十大必备网站
partner4java
博客等级 码龄17年 481粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值