Java并发(四)----线程运行原理

这篇具有很好参考价值的文章主要介绍了Java并发(四)----线程运行原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、线程运行原理

1.1 栈与栈帧  

Java Virtual Machine Stacks (Java 虚拟机栈 JVM)

我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。

  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存

  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

单线程示例代码

public class TestFrames {
    public static void main(String[] args) {
        method1(10); // 断点处
    }
​
    private static void method1(int x) {
        int y = x + 1;
        Object m = method2();
        System.out.println(m);
    }
​
    private static Object method2() {
        Object n = new Object();
        return n;
    }
}

在打断点处,可以看到一个栈帧

Java并发(四)----线程运行原理

执行到method1,可以看到新起了一个栈帧

Java并发(四)----线程运行原理

当执行到method2时,可以看到又新起了一个栈帧

Java并发(四)----线程运行原理

由于是栈,随着的程序的运行,后面开启的栈帧会先被销毁,直至main栈帧被销毁,此刻程序运行完成。

对应图解:

Java并发(四)----线程运行原理

内存释放后

Java并发(四)----线程运行原理

具体就是:

1.将编译好的字节码加载到jvm的方法区内存中
2.jvm启动一个main的主线程,cpu核心就准备运行主线程的代码了,给主线程分配自己的栈内存【args、局部变量、返回地址、所记录】,每个线程的栈里面还有个程序计数器
程序计数器的作用:当cpu要执行哪行代码了,就去这个里面去要
3.把主方法的里面代码行放到程序计数器
4.主方法调用的是method1的方法,为method1分配栈内存,里面存储这个方法里面局部变量,返回地址,这些变量是分配内存时,会把空间预留好
5.将method1的第一行读到程序计数器让cpu执行
6.methode1下一行调用method2()方法,创建他的栈内存
7.把Object n = new Object()这行代码读取到计数器,在队中创建对象
8.method2()将返回地址给m,方法执行完就可以释放掉method2()的栈内存
9.一层层方法结束后,依次释放掉每个方法线程

现在来看看多线程下的栈与栈帧

public class TestFrames {
    public static void main(String[] args) {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                method1(20);// 断点处
            }
        };
        t1.setName("t1");
        t1.start();
        method1(10);// 断点处
    }
​
    private static void method1(int x) {
        int y = x + 1;
        Object m = method2();
        System.out.println(m);
    }
​
    private static Object method2() {
        Object n = new Object();
        return n;
    }
}
​

在第一个断点处

Java并发(四)----线程运行原理

可以看到多个线程同时运行中,我们可以选择具体的线程来查看运行状况并且往下运行,具体的读者可以自行实践。

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

因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码(简单来说就是从使用cpu到不使用cpu

  • 线程的 cpu 时间片用完

  • 垃圾回收

  • 有更高优先级的线程需要运行

  • 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法

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

  • 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等

  • Context Switch 频繁发生会影响性能,因为线程数不是越多越好。文章来源地址https://www.toymoban.com/news/detail-434453.html

 

到了这里,关于Java并发(四)----线程运行原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java|多线程与高并发】线程池详解

    Java线程池是一种用于管理和重用线程的机制,它可以在需要执行任务时,从线程池中获取线程,执行任务,然后将线程放回池中,以便后续使用。线程池可以有效地管理线程的数量,提高程序的性能和资源利用率。 为什么从线程池里面取线程比直接创建线程快呢? 创建线程是

    2024年02月11日
    浏览(47)
  • JAVA的多线程及并发

    继承 Thread 类; 实现 Runnable 接口; 实现 Callable 接口通过 FutureTask 包装器来创建 Thread 线程; 使 用 ExecutorService 、 Callable 、 Future 实 现 有 返 回 结 果 的多 线 程 ( 也 就 是 使 用 了 ExecutorService 来管理前面的三种方式)。 1、使用退出标志,使线程正常退出,也就是当 run

    2024年03月13日
    浏览(50)
  • Java 并发(多线程)超详细

    此文章已收录至项目 Developer-Knowledge-Base https://www.cnblogs.com/snow-flower/p/6114765.html java 中的 Lock 锁 https://javaguide.cn/java/concurrent/java-concurrent-questions-03.html https://www.cnblogs.com/lifegoeson/p/13683785.html 程序是由指令和数据有序组成的静态概念,程序本身没有运行的含义,只有在处理器赋予

    2024年02月09日
    浏览(40)
  • 【Java 并发编程】一文读懂线程、协程、守护线程

    在 Java 线程的生命周期一文中提到了 就绪状态的线程在获得 CPU 时间片后变为运行中状态 ,否则就会在 可运行状态 或者 阻塞状态 ,那么系统是如何分配线程时间片以及实现线程的调度的呢?下面我们就来讲讲线程的调度策略。 线程调度是指系统为线程分配 CPU 执行时间片

    2023年04月08日
    浏览(60)
  • 【并发多线程】java并发中的Synchronized关键词

    如果在多线程的环境中,我们经常会遇到资源竞争的情况,比如多个线程要去同时修改同一个共享变量,这时候,就需要对资源的访问方法进行一定的处理,保证同一时间只有一个线程访问。 java提供了synchronized,方便我们实现上述操作。 我们举个例子,我们创建一个

    2023年04月13日
    浏览(44)
  • Java并发编程面试题——线程池

    参考文章: 《Java 并发编程的艺术》 7000 字 + 24 张图带你彻底弄懂线程池 (1) 线程池 (ThreadPool) 是一种用于 管理和复用线程的机制 ,它是在程序启动时就预先创建一定数量的线程,将这些线程放入一个池中,并对它们进行有效的管理和复用,从而在需要执行任务时,可以从

    2024年02月07日
    浏览(51)
  • Java并发编程之线程池详解

    目录 🐳今日良言:不悲伤 不彷徨 有风听风 有雨看雨 🐇一、简介 🐇二、相关代码 🐼1.线程池代码 🐼2.自定义实现线程池 🐇三、ThreadPoolExecutor类 首先来介绍一下什么是线程池,线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程

    2024年02月12日
    浏览(46)
  • java 多线程处理大量并发数据

    Java中多线程是一种处理数据的常见方式,它可以同时执行多个线程以提高程序的性能和效率。下面是一个使用多线程处理数据的示例代码: 在上面的代码中,我们创建了一个数组 data 来存储待处理的数据。然后,我们创建了一个线程数组 threads ,用于存储要执行的线程。 通

    2024年02月09日
    浏览(54)
  • Java并发(1)--线程,进程,以及缓存

    进程 进程是程序的一次执行过程,系统程序的基本单位。有自己的main方法,并且主要由主方法运行起来的基本上就是进程。 线程 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享 堆

    2024年04月16日
    浏览(48)
  • Java多线程——并发和并行、实现方法

    代码演示 方式一 方式二 方式三

    2024年01月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包