一 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

最新文章

  1. 计算bean的和(java)
  2. Python基础篇【第7篇】: 面向对象(2)
  3. SQLMAP脱裤
  4. Unity AngryBots愤怒的机器人demo研究
  5. MySQL数据库服务器的架设
  6. include、include_once与require、require_once区别
  7. Linux 中open系统调用实现原理【转】
  8. SQL 2008下载地址以及全新安装详细过程
  9. oracle11.0.2 64位版本 Toad连接
  10. JavaScript网站设计实践(七)编写最后一个页面 改进表单
  11. JAVA时间日期处理类,主要用来遍历两个日期之间的每一天。
  12. C#语法糖之第一篇:自动属性&隐式类型
  13. 数据结构(左偏树,可并堆):BNUOJ 3943 Safe Travel
  14. FTP创建与操作
  15. Codeforces 18C C. Stripe
  16. 让工程师爱上CMM,实现管理于无形 --- 中标软件CMMI L5之路 (2/2)
  17. JavaScript练习笔记整理·2 - 6.24
  18. Redisson分布式锁的简单使用
  19. layui学习
  20. ajax上传下载自定义圆形滚动条

热门文章

  1. 单进程单线程的Redis如何能够高并发
  2. 阿里云的OCS缓存机制
  3. 是否使用TDD(测试驱动开发)进行UI开发
  4. Python练习-sys.argv的无聊用法
  5. 查看oracle数据库日志存放位置
  6. Find Minimum in Rotated Sorted Array I & II
  7. 【驱动】USB驱动·入门【转】
  8. UBIFS文件系统简介 与 利用mkfs.ubifs和ubinize两个工具制作UBI镜像 (完整理解版本)
  9. 如何同步删除svn管理的package包目录
  10. robotframework-ride多次运行,有时候不显示日志信息