4.8多线程--线程运行

扩展内容

查看线程

windows

  • tasklist 、tasklist | findstr java (管道运算符)
  • taskkill 、taskkill /F /PID XXX(/F 强制杀死 )

Linux

  • ps -fe 查看所有进程
  • ps -fT -p <PID> 查看某个进程(PID)的所有线程
  • kill 杀死进程
  • top 按大写 H 切换是否显示线程
  • top -H -p <PID> 查看某个进程的所有线程

Java

  • jps 命令查看所有 Java 进程
  • jstack <PID> 查看某个进程的所有线程状态
  • jconsole 来查看某个Java 进程中线程的运行情况(图形界面)
jconsole 远程监控配置
  • 需要以如下方式运行你的 java 类
java -Djava.rmi.server.hostname=IP 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=PORT 
-Dcom.sun.management.jmxremote.ssl=true/false(是否启用安全链接) 
-Dcom.sun.management.jmsremote.authenticate=true/false(是否认证) JAVA类
  • 修改 /etc/hosts 文件 将 127.0.0.1 映射到主机名

如果需要认证访问,还需要做如下步骤

  • 复制 jmxremote.password 文件
  • 修改 jmxremote.password he jmxremote.access 文件的权限为 600 即文件所有者可读写
  • 连接时填入 controlRole(用户名),R&D(密码)

线程运行原理

栈与栈帧

Java Virtual Machine Stacks(Java 虚拟机栈)
JVM 由堆、栈、方法区组成,其中,栈就是给线程使用的,每个线程启动后,虚拟机就会给其分配一块栈内存。

  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法


    image.png

    image.png

    image.png

线程上下文切换(Thread Context Switch)

因为以下原因导致 CPU 不再执行当前线程,转而执行另一个线程的代码

  • 线程的 CPU 时间片用完
  • 垃圾回收(垃圾回收线程执行时,会暂停其他的工作线程)
  • 有更高优先级的线程需要运行(前三种都是被动的)
  • 线程自己调用了sleep、yield、wait、join、park、synchronized、lock 等方法

当 Context Switch 发生时,需要有操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),他的作用是记住下一条 JVM 指令的执行地址,是线程私有的

  • 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等
  • Context Switch频繁发生会影响性能


    image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 并发编程 Java线程 创建和运行线程 查看线程 线程API 线程状态 创建和运行线程 方法一,直接使用new T...
    站得高看得远阅读 1,885评论 1 1
  • 并发编程 1. 概览 [图片上传失败...(image-d1d9e2-1630336667330)] [图片上传失...
    4646ea81318d阅读 1,755评论 0 0
  • # 并发编程 ## 1. 概览 [图片上传失败...(image-d1d9e2-1630336667330)] [...
    4646ea81318d阅读 2,812评论 0 0
  • 进程和线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在...
    codeMover阅读 2,435评论 0 1
  • windows 任务管理器可以查看进程和线程数,也可以用来杀死进程 tasklist 查看进程 taskkill ...
    递归宇宙阅读 3,073评论 0 0