CPU线程 和 Java线程
一 cpu个数、核数、线程数的关系
cpu个数:是指物理上,也及硬件上的核心数;
核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;一个CPU核心数模拟出2线程的CPU
线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数,及程数=cpu个数(2) * 核数(2)=4
Windows: wmic 然后 物理CPU数 “cpu get NumberOfCores”, CPU核心数 “cpu get NumberOfLogicalProcessors”
Linux:
查看CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
查看核数 cat /proc/cpuinfo| grep "cpu cores"| uniq
二 cpu线程数和Java多线程
(1) 线程是CPU级别的,单个线程同时只能在单个cpu线程中执行
(2) Java多线程并不是由于cpu线程数为多个才称为多线程,当Java线程数大于cpu线程数,操作系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。
(3) 线程是操作系统最小的调度单位,进程是资源(比如:内存)分配的最小单位
(4)Java中的所有线程在JVM进程中,CPU调度的是进程中的线程
线程的调度是指按照特定的机制为多个线程分配CPU的使用权。有两种调度模型:分时调度模型和抢占式调度模型
- 分时调度模型是指让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用CPU的时间片。
- Java虚拟机采用抢占式调度模型,是指优先让可运行池中处于就绪态的线程中优先级高的占用CPU,如果可运行池中线程的优先级相同,那么就随机选择一个线程,使其占用CPU,处于运行状态的线程会一直执行,直至它不得不放弃CPU,一个线程会因为以下原因放弃CPU:
- (1)Java虚拟机让当前线程暂时放弃CPU,转到就绪态,使其他线程获得运行机会
- (2)当前线程因为某些原因而处于阻塞状态
- (3)线程运行结束
Java线程让步:
3. Thread.yield()方法
当线程在运行中执行了Thread类的yield()静态方法时,如果此时具有相同优先级的其他线程处于就绪状态,那么yield()方法将把当前运行的线程放到可运行池中并使另一个线程运行。如果没有相同优先级的可运行进程,则yield()方法什么也不做
sleep()方法和yield()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程。两者的区别在于:
(1)sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低优先级线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会
(2)当线程执行sleep(longmillis)方法后,将转到阻塞状态,参数millis制定睡眠时间;当线程执行yield()方法后,将转到就绪状态
4.等待其他线程结束:join()
当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会恢复运行(阻塞恢复到就绪)
参考
https://blog.csdn.net/qq_35529801/article/details/78699867
https://www.cnblogs.com/timxgb/p/9507316.html
最新文章
- 计算bean的和(java)
- Python基础篇【第7篇】: 面向对象(2)
- SQLMAP脱裤
- Unity AngryBots愤怒的机器人demo研究
- MySQL数据库服务器的架设
- include、include_once与require、require_once区别
- Linux 中open系统调用实现原理【转】
- SQL 2008下载地址以及全新安装详细过程
- oracle11.0.2 64位版本 Toad连接
- JavaScript网站设计实践(七)编写最后一个页面 改进表单
- JAVA时间日期处理类,主要用来遍历两个日期之间的每一天。
- C#语法糖之第一篇:自动属性&;隐式类型
- 数据结构(左偏树,可并堆):BNUOJ 3943 Safe Travel
- FTP创建与操作
- Codeforces 18C C. Stripe
- 让工程师爱上CMM,实现管理于无形 --- 中标软件CMMI L5之路 (2/2)
- JavaScript练习笔记整理·2 - 6.24
- Redisson分布式锁的简单使用
- layui学习
- ajax上传下载自定义圆形滚动条
热门文章
- 单进程单线程的Redis如何能够高并发
- 阿里云的OCS缓存机制
- 是否使用TDD(测试驱动开发)进行UI开发
- Python练习-sys.argv的无聊用法
- 查看oracle数据库日志存放位置
- Find Minimum in Rotated Sorted Array I &; II
- 【驱动】USB驱动·入门【转】
- UBIFS文件系统简介 与 利用mkfs.ubifs和ubinize两个工具制作UBI镜像 (完整理解版本)
- 如何同步删除svn管理的package包目录
- robotframework-ride多次运行,有时候不显示日志信息