Java中多线程,java栈和堆面试题

2023-11-09

public static void main(String[] args)

{

//创建自定义线程对象

myThread mT = new myThread();

//开启新线程,让新的线程执行程序,jvm调用线程中的run

mT.start();

//在main方法中执行

for(int i = 0;i < 50;i++)

{

System.out.println(“main线程正在执行” + i);

}

}

分析:

  • 在主线程中创建自定义线程对象,调用star方法开启新线程,让新的线程执行
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

程序,jvm再调用线程中的run方法

  • 创建新的线程后,会产生两个执行路径,都会被CPU执行,CPU有自己的选择执行权力,所以会出现随机的执行结果

  • 可以理解为两个线程在抢夺CPU的资源(时间)

  • 注:线程对象调用 run 方法和调用 star 方法的区别:

(1) 线程对象调用 run 方法不开启线程,仅仅是对象调用方法

(2) 线程对象调用 star 方法开启线程,并让 JVM 调用 run 方法在开启的线程中执行

问题分析:

为什么要继承 Thread 类,并调用 star 方法才能开启线程,为什么不像下面代码一样直接创建 Thread 类的对象呢?

Thread t1 = new Thread();

t1.star();

  • 创建线程的目的是为了建立程序单独的执行路径,让多部分代码实现同时执行,而以上代码,直接创建 Thread 类的对象,虽然没有语法错误,不会报错,但该 star 调用的是Thread 类中的 run 方法,而这个方法什么也没做,更重要的是这个 run 方法中并没有定义我们需要让线程执行的代码

  • Thread 类 run 方法中的任务并不是我们所需要的,只有重写这个 run 方法,Thread 类已经定义了线程任务的编写位置(run 方法),那么只要在 run 方法中定义任务代码即可,即重写 run 方法

(2) 多线程内存理解

  • 多线程在执行的时候,是在栈内存中的,每一个执行线程都有一片自己的所属栈内存空间,进行方法的压栈和出栈

  • 当执行线程的任务结束了,线程自动在栈内存中释放,当所有的执行线程都结束了,进程也就结束了

(3) 获取和设置线程名称

  • String getName():返回该线程的名称(同 Thread.currentThread().getName())

  • Thread.currentThread():获取当前线程对象

  • Thread.currentThread().getName():获取当前线程对象的名称

  • setName():设置线程名称

public static void main(String[] args)

{

myThread mT = new myThread();

mT.start();

mT.setName(“oneStar”); //设置线程名称

//System.out.println(getName()); //使用getName()方法获取线程名称 在新线程中可以这样使用

System.out.println(Thread.currentThread().getName()); //使用Thread.currentThread().getName()获取线程名称

System.out.println(Thread.currentThread()); //获取当前线程对象

}

(4) Thread 类 sleep 方法

sleep 方法是一个静态的方法,可以通过 Thread 类直接调用,会有异常抛出

public static void main(String[] args) {

myThread mT = new myThread();

mT.start();

//使用sleep方法延时打印for循环

for(int i = 0;i < 5;i++)

{

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(i);

}

}

2、实现 Runnable 接口创建线程(方法二)


Runnable 接口用来指定每一个线程要执行的任务,包含了一个 run 的无参数抽象方法,需要由接口实现重写该方法。此创建线程的方法是声明实现 Runnable 接口的类,该类实现 run 方法,然后创建 Runnable 的子类对象,传入到某个线程的构造方法中,开启线程

(1) 创建步骤:

  • 定义类实现 Runnable 接口

  • 重写接口中的 run 方法

  • 创建 Thread 类的方法

  • 将 Runnable 接口的子类对象作为参数传递给 Thread 类的构造函数

  • 调用 Thread 类的 star 方法开启线程

定义实现类接口

//定义实现类接口

public class myRunnable implements Runnable {

//重写run方法

public void run()

{

for(int i = 0;i < 5;i++)

{

System.out.println(“myRunnable线程正在执行!”);

}

}

}

在主线程中调用

public static void main(String[] args)

{

//创建线程执行目标类对象

myRunnable mR = new myRunnable();

//将Runnable接口的子类对象作为参数传递给Thread类的构造函数

Thread t1 = new Thread(mR);

Thread t2 = new Thread(mR);

//开启线程

t1.start();

t2.start();

for(int i = 0;i < 5;i++)

{

System.out.println(“main线程正在执行!”);

}

}

(2) 实现 Runnable 接口的好处

  • 避免了单继承的局限性,所以此方法较为常用

  • 将线程分为两部分,一部分线程对象,一部分线程任务,更加符合面向对象思想(继承 Thread 类线程对象和线程任务耦合在一起)

  • 将线程任务单独分离出来封装成对象,类型就是 Runnable 接口类型

  • Runnable 接口对线程对象和线程任务进行解耦,降低紧密性或依赖性,创建线程和执行任务不绑定

三、线程的匿名内部类

==========

使用线程的匿名内部类方式,可以方便的实现每个线程执行不同线程任务操作

方法一:重写 Thread 类中的方法创建线程

new Thread() {

public void run() {

for (int x = 0; x < 40; x++) {

System.out.println(Thread.currentThread().getName()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中多线程,java栈和堆面试题 的相关文章

随机推荐

  • Qt控件----显示窗口部件

    文章目录 显示窗口部件 一 QLabel 1 控件简介 2 用法示例 3 运行效果 二 QCalendarWidget 1 控件简介 2 用法示例 3 运行效果 三 QLCDNumber 1 控件简介 2 用法示例 3 运行效果 四 QPr
  • SQL Part 2 ---常用关键字

    SQL 关键字 常用关键字 Keywords ORDER BY DESC AS Like 星号符 DISTINCT Union INTERSECT EXCEPT 嵌套查询 Nested Query IN NOT IN 在WHERE中使用 I
  • sh ndk-build.cmd command not found

    sh中写ndk build 会报错 ndk build cmd command not found 或者报错 ndk build 未找到命令 解决方法 写ndk build的完整路径 比如 home jason android ndk r1
  • 任务8 使用Word2Vec进行推荐

    任务8 使用Word2Vec进行推荐 1 原理 我们有了用户的embedding很容易就可以利用这些embedding来计算用户的相似度 有了用户的相似度 我们接下来就可以使用前面任务4的一些函数来直接进行推荐 2 代码实现 导入相关的包
  • 关于编程设计模式的简介

    编程设计模式 一 创建模式 Creational Patterns 1 工厂模式 Factory Pattern 2 抽象工厂模式 Abstract Factory Pattern 3 单例模式 Singleton Pattern 4 建造
  • 2020年度总结

    眼看又要年底了 趁着这个双休 给即将过去的 2020 做个简单的总结 今年发生了很多事情 对我的影响很大 年初 2020年1月7日 我入职了上一家公司 在一个 Unity 项目组里做游戏开发 工资虽然不高 但是业务轻车熟路 也在组里涨了不少
  • 使用终端MobaXterm连接Centos

    1 下载MobaXterm 官网 https mobaxterm mobatek net download html 2 MobaXterm连接Linux 1 查看刚才安装的 Linux 的 IP 地址 2 连接 3 Linux自带了JRE
  • 【CUDA编程】线程ID与全局ID的映射关系

    blockDim 方向 指的是该方向上thread的总数 girdDim 方向 指的是该方向上block的总数 1 1D grid 1D block threadId blockIdx x blockDim x threadIdx x 2
  • 阿里巴巴Java开发手册 PDF

    泰山版 更新日期 2020 04 22 链接 https pan baidu com s 1qf252ZN1zMZ16KY ok8uNg 提取码 zxcp 嵩山版 更新日期 2020 08 03 链接 https pan baidu com
  • python与java的一些不同简录

    1 coding UTF 8 2 Python 中单行注释以 开头 多行注释采用三对单引号 或者三对双引号 将注释括起来 3 Python 最具特色的就是使用缩进来表示代码块 缩进的空格数是可变的 但是同一个代码块的语句必须包含相同的缩进空
  • 如何在IEEE的模板中引用Arxiv中的论文

    如何在IEEE的模板中引用Arxiv中的论文 本文章记录如何在IEEE Transactions的模板中 引用Arxiv中的论文 记录具体的论文格式信息 目录 如何在IEEE的模板中引用Arxiv中的论文 1 在IEEE的模板中引用Arxi
  • 匹配算法之 匈牙利算法详解

    参考 算法学习笔记 5 匈牙利算法 漫谈匈牙利算法 匈牙利算法 KM算法 匈牙利算法 二分图 通俗易懂小白入门 二分图最大匹配 匈牙利算法 多目标跟踪之数据关联 匈牙利匹配算法和KM算法 小白学习笔记 一 目标跟踪 匈牙利匹配 一 匈牙利算
  • jQuery Ajax 全解析

    本文地址 jQuery Ajax 全解析 本文作者 QLeelulu 转载请标明出处 jQuery确实是一个挺好的轻量级的JS框架 能帮助我们快速的开发JS应用 并在一定程度上改变了我们写JavaScript代码的习惯 废话少说 直接进入正
  • HBuilderX集成Git教程,需要安装TortoiseGit依赖

    1 HBuilder安装git插件 需要提前安装好git客户端 略过 点击 工具 插件安装 此时还是不能提交代码的 右键选中我们需要的项目 点击 外部命令 Git插件 然后随便选择一个操作 会提示需要安装TortoiseGit 然后跳转到T
  • 归并排序【图解及模板】

    全文目录 归并排序的思想 操作原理 归并排序演示图 代码模板 总结 归并排序的思想 归并排序是建立在归并操作上的一种有效 稳定的排序算法 该算法是采用分治法 Divide and Conquer 的一个非常典型的应用 将已有序的子序列合并
  • keil5改工程名称_Keil5建立stm32工程

    一 准备工作 1 首先在项目名称下建立一个文件夹 作为存放程序的地方 2 在总文件夹下 依次建立User Driver List Output三个文件夹 作为存放main函数 驱动函数 编译和输出文件的子文件夹 二 建立工程 1 打开kei
  • GO 依赖注入

    依赖注入是软件工程中经常使用到的一种技术 它提供了一种控制反转的机制 把控制权利交给了调用方 调用方来决定使用哪些参数 哪些对象来进行具体的业务逻辑 依赖注入的本质其实是为了将组件的创建与其依赖的创建分离 实现原理 通过反射读取对象的依赖
  • elementUi使用自定义表格时给表头自定义成el-input导致el-input失效的问题

    我们在使用elementUi的表格组件时往往需要自定义表格 很多还需要自定义表头 比如这种 我们再表格的头部插入el input组件 这时就会发现 你在表头的el input输入时不显示 解决方法就是给slot header 换成 head
  • 2023华为OD机试真题-对称字符串(JAVA、Python、C++)

    题目描述 对称就是最大的美学 现有一道关于对称字符串的美学 已知 第 1 个字符串 R 第 2 个字符串 BR 第 3 个字符串 RBBR 第 4 个字符串 BRRBRBBR 第 5 个字符串 RBBRBRRBBRRBRBBR 相信你已经发
  • Java中多线程,java栈和堆面试题

    public static void main String args 创建自定义线程对象 myThread mT new myThread 开启新线程 让新的线程执行程序 jvm调用线程中的run mT start 在main方法中执行