• 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()方法

    就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行(根据CPU的调度),并不是单纯的让给其他线程。

    4.等待其他线程结束:join()
    当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会恢复运行(阻塞恢复到就绪)

    参考 

    https://blog.csdn.net/qq_35529801/article/details/78699867

    https://www.cnblogs.com/timxgb/p/9507316.html

  • 相关阅读:
    Ansible安装配置
    Git 工作流程
    使用 Docker 搭建 Tomcat 运行环境
    Linux的cron与%
    配置sonar和jenkins进行代码审查
    Jenkins配置基于角色的项目权限管理
    Jenkins和maven自动化构建java程序
    Jenkins修改workspace和build目录
    Git 进阶指南
    git代码回滚:Reset、Checkout、Revert的选择
  • 原文地址:https://www.cnblogs.com/webglcn/p/10639065.html
Copyright © 2020-2023  润新知