首页 > 系统相关 >java多线程内存图

java多线程内存图

时间:2023-07-25 11:22:06浏览次数:33  
标签:java name text data 内存 nodes 多线程 type id

多线程的例子

例一:

public class Test {
    public static void main(String[] args) throws Exception {
        Thread x1=new Thread(){
            @Override
            public void run(){
                for (int i = 0; i < 100; i++) {
                    System.out.println("我是线程x1,输出:"+i);
                }
            }
        };
        x1.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("---->我是主线程,输出"+i);
        }
    }
}
部分运行结果: 0 ===>发现这个结果是交替运行的   例二:
public class Test {
    public static void main(String[] args) throws Exception {
        Thread x1=new Thread(){
            @Override
            public void run(){
                Person w1=new Person();
                w1.m2();
            }
        };
        Thread x2=new Thread(){
            @Override
            public void run(){
                Person w1=new Person();
                w1.m3();
            }
        };

        x1.start();
        x2.start();

        Person w1=new Person();
        w1.m1();
    }
public class Person {
    public int age;
    public String name;

    public void m1() {
        System.out.println("m1方法开始");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("m1方法结束");
    }
    public void m2() {
        System.out.println("m2方法开始");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("m2方法结束");
    }
    public void m3() {
        System.out.println("m3方法开始");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("m3方法结束");
    }

    public static void m4() {
        System.out.println("m4方法开始");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("m3方法结束");
    }
}
运行结果: 0  

对应内存原理图:

1、主方法入栈,并创建两个对象x1,x2(Thread()也在方法区,这里没有画),x1 x2new出来的两个线程对象进入方法区 0   2、 0 start( )表示进入就绪状态,句柄就是变量 14个内核就是说同一个时间只能同时执行14个任务。  
  • 也就是说我们例二中的三个线程x1,x2,main要执行的话,必须抢占CPU。
  • 右击运行程序,包括 .start( ) 进入就绪状态,都是将他们三个交给操作系统进入就绪队列,而不是立即执行的意思。
  • 他们什么时候执行完全取决于操作系统。

就绪队列调度:

  • 就绪队列里边都是一个个的线程任务,供操作系统选择。
  • CPU每次执行任务会从就绪队列中选择一个执行,执行一段时间后切换。这段时间有可能把任务执行完,如果没有执行完就保留状态,再切换到其他线程。
  • 不一定先进入就绪队列的就先执行,先开始执行也不一定是先执行完的。
  3、创建两个线程栈,栈中有run方法,run方法内分别创建了Person w1对象,并在堆中开辟对象空间。 0 4、w1中调用了m2方法,m2拷贝入栈; 另一个w1调用了m3方法,m3拷贝入栈。 0 4.1、m2方法中还调用了m3,m3拷贝入栈。 0 5、接下来 Person w1=new Person(); w1.m1(); 主线程也创建了w1对象,并调用了他的m1方法 0 到现在 还是在并行阶段,没有并发,没有竞争资源  

让多线程竞争一个资源 成为并发

public class Test {
    public static void main(String[] args) throws Exception {

        Person k1=new Person();

        Thread x1=new Thread(){
            @Override
            public void run(){
                Person w1=new Person();
                w1.m2();
                k1.age++;
            }
        };
        Thread x2=new Thread(){
            @Override
            public void run(){
                Person w1=new Person();
                w1.m3();
                k1.age++;
            }
        };

        x1.start();
        x2.start();

        Person w1=new Person();
        w1.m1();
        k1.age++;
        System.out.println(k1.age);
    }
}
Person k1=new Person(); 增加 k1 对象,并且让三个线程对k1的age进行++操作。   --->可以发现,每次运行后的结果都不同 0 0     ====>这样就说明了,写到同一个线程内的代码执行顺序有先后,但在不同线程中的代码就不能确定谁先谁后执行了。可能一个线程中的代码执行了两行后又切到了另一个线程了。

标签:java,name,text,data,内存,nodes,多线程,type,id
From: https://www.cnblogs.com/nliu/p/17579315.html

相关文章

  • Java后端01(初识servlet)
    servlet添加依赖坐标(maven)<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency>小测试​ 所有请求都会固定携带一个参数(method)代表请求的方式(GET,POST,PUT,D......
  • 【JAVA】java日志框架 - slf4j
    1、配置依赖<!--slf4j日志门面--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.26</version></dependenc......
  • JavaWeb--环境搭建(idea,tomcat)到跑测试中我犯下的滔天大罪
    1.在网上copy时路径没有写对点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation......
  • Java开发笔记之mac的intellij idea在debug模式下卡住的问题
    0x00问题描述mac的Intellijidea在debug模式下放行时,程序会卡住无响应;即使在已经放行的情况下,后续代码也不运行,console内只显示Theapplicationisrunning或者等了很久程序才开始后续的运行。 0x01解决方案修改host中的配置。通过以下命令,打开hosts的编辑页面。sudovi......
  • int强制转换char在Java中的使用方法
    int强制转换char在Java中的使用方法在Java编程中,我们经常需要进行数据类型的转换,以便满足不同的需求。其中一个常见的转换就是将int类型强制转换为char类型。本文将围绕这一主题,介绍int强制转换char的使用方法,并探讨一些相关的注意事项。首先,让我们来看一下int和char的基本概念......
  • Java3DES双倍长加密算法详解
     Java3DES双倍长加密算法是一种强大的加密算法,它可以保护我们的敏感数据不被未经授权的人访问。在本文中,我将详细介绍Java3DES双倍长加密算法的原理和使用方法。首先,让我们来了解一下Java3DES双倍长加密算法的原理。这种算法是基于DES(DataEncryptionStandard)算法的改进版本......
  • Java 字符串转整形数组的方法及注意事项
     在Java编程中,经常会遇到需要将字符串转换为整形数组的情况。这是一个常见的操作,它可以帮助我们更方便地处理数据。本文将介绍一些常见的方法和注意事项,以帮助您顺利完成字符串转整形数组的任务。方法一:使用split()方法split()方法是Java中常用的字符串分割方法,它可以按照指......
  • Java中类型如何进行补零操作
     在Java编程中,我们经常需要对不同类型的数据进行处理和操作。其中一个常见的操作是对数字进行补零操作,以满足特定的需求。在本文中,我们将探讨Java中不同类型数据的补零操作方法。对于整数类型,我们可以使用NumberFormat类来进行补零操作。NumberFormat是一个用于格式化数字的工......
  • GE反射内存卡的指标和型号
    产品特性:•1路发送,1路接收;•光纤高速网络2.12GHz;•最大256个节点;•光纤协议不占用CPU资源;•多模光纤节点距离300米;单模光纤节点距离10千米;•板载128M/256MByteSDRAM;•低延迟率(n秒级);•动态包长:每个包4到64或1M个字节。产品选型:1、CPCI接口-5565PIORC-110000(128MSDRAM多......
  • 【java】智慧导诊系统:根据患者症状匹配挂号科室
    一、系统概述:医院智慧导诊系统是在医疗中使用的引导患者自助就诊挂号,在就诊的过程中有许多患者不知道需要挂什么号,要看什么病,通过智慧导诊系统,可输入自身疾病的症状表现,或选择身体部位,在经由智慧导诊系统多维度计算,精准推荐科室,引导患者挂号就诊,实现科学就诊,不用担心挂错号。二、......