Java多线程(面试)

2023-11-08

一、程序、进程与线程

        程序:Program

程序是一段静态代码

        进程:Process

进程是指一种正在运行的程序,有自己的地址空间
        特点:
            动态性,并发性,独立性

        并发和并行的区别:

并发: 多个cpu同时执行多个任务
并行: 一个cpu同时执行多个任务

        线程:Thread

线程是进程内部的一个执行单元,它是程序中一个单一的顺序控制流程。
线程又是轻量级的进程。
如果在一个进程中运行多个线程,用来完成不同工作,则称之为多线程。

        线程的特点:

轻量级进程。
独立调度的基本单位。
可并发执行。
共享进程资源。

        进程与线程的区别:

进程与线程的区别

二、线程的创建和启动

    

    1.线程的创建方式比较:

        1.1 继承Thread类方式的多线程:

优势:编写简单
劣势:无法继承其他父类,只能单继承

        1.2 实现Runnable接口方式的多线程(比较常用)

优势:可以继承其他类,多线程可共享同一个Runnable对象
劣势:编程方式稍微复杂,如果需要访问当前线程,需要调用Thread.currentThread()方法。
            线程没有返回值

        1.3 实现Callable接口

优势: 与实现Runnbale相比,Callable功能更加强大
            方法不同
            可以有返回值,支持泛型的返回值
            可以抛出异常
            需要借助FutureTask,比如获取返回结果

    2.线程的创建

方式1:继承Java.lang.Thread类,并覆盖run()方法
方式2:实现Java.lang.Runnable接口,并实现run()方法
方式3:实现Callable接口,并实现call()方法

    3.线程的启动

a.新建的线程不会自动开始执行,必须通过start()方法启动
b.不能直接调用run()来启动线程,这样run()将作为一个普通方法立即执行,执行完毕前其它线程无法执行
c.Java程序启动时,会立刻创建主线程,main就是在这个线程上运行的。当不再产生新线程时,程序是单线程的

三、线程的生命周期

线程的状态转换图

新生状态:
    用new关键字建立一个线程对象后,该线程对象就处于新生状态。
    处于新生状态的线程拥有自己的内存空间,可以通过调用start进入就绪状态。

就绪状态:
    处于就绪状态的线程具备了运行条件,但还没分配cpu,处于线程就绪队列,等待系统为其分配cpu。
    当系统选定一个等待执行的线程后,它就会从就绪状态进入执行状态,改动做成为"cpu调度"。

运行状态:
    在运行状态的线程执行自己run方法中的代码,直到等待某资源而堵塞或完成任务死亡。
    如果给定的时间片内没有执行结束,就会被系统给换下来回到等待执行状态。

堵塞状态:
    处于运行状态的线程在某些情况下,如执行了sleep()方法,或等待I/O设备等资源,将让出cpu并暂时停止自己的运行,进入堵塞状态。
    在堵塞状态下的线程不能进入就绪队列。只有当引起堵塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便进入就绪状态,重新到就绪状态队列排队等待,被系统选中时从原来的位置继续运行。

死亡状态:
    死亡状态是线程生命周期的最后一个阶段。线程死亡的原因有三个:1.正常运行的线程完成了它的全部工作。2.线程被强制的终止,如通过stop()方法停止执行(不推荐使用)。3.线程抛出未捕获的异常。

四、线程控制方法

    优先级:

        线程的优先级用数字表示,范围从1到10

Thread.MIN_PRIORITY = 1 最低优先级
Thread.MAX_PRIORITY = 10 最高优先级
Thread.NORM_PRIORITY = 5 默认优先级

    获得或设置线程对象的优先级

int getPriority()
void setPriority(int newPriority);

注意:优先级低只是意味着获得调度的概率低。并不是绝对先调用优先级高后调用优先级低的线程。

    控制线程的方法

join()
    堵塞指定线程等到另一个线程完成以后再继续执行
sleep()
    使线程停止运行一段时间,将处于堵塞状态
    如果调用了sleep方法后,没有其他等待执行的线程,这个时候当前线程不会马上恢复执行
yield()
    让当前正在执行的停止,不是堵塞线程,而是将线程转入就绪状态
    如果调用了yield方法后,没有其他等待执行的线程,这个时候当前线程会马上恢复执行
setDeamon()
    可以将指定的线程设置成后台线程
    创建后台程序结束时,后台线程也会随之消亡
    只能在线程启动前将它设置为后台线程
interrupt()
    并没有直接中断线程,而是需要被中断线程自己处理
stop()
    结束线程,不推荐使用

五、线程同步

    原因:

当多个线程访问同一个数据时,容易出现线程安全问题。需要让线程同步,保证数据安全。

    线程同步:

当两个或两个以上线程访问同一资源时,需要某种方式来确保资源在某一时刻只被一个线程使用

    线程同步的实现方案:
        同步代码块:

synchronized (对象|属性|类字节码) {
			需要同步的java代码
}

        同步方法:

 public synchronized void test(){
       
    }

    线程同步优缺点:

优点:解决了线程安全问题
缺点:性能下降,会带来死锁

    死锁:

当两个线程互相等待对方释放锁时就会发生死锁。
出现死锁时不会出现异常,不会出现提示,只是所有的线程都处于堵塞,无法继续
多线程编程时应该注意避免死锁的发生

    死锁的发生场景:生产者和消费者问题:

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

Java多线程(面试) 的相关文章

  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有

随机推荐

  • 32天高效突击:框架+性能优化+微服务+分布式,笔记面试全有

    导言 今年似乎因为疫情影响 时间过得特别快 对于需要跳槽换工作的人来 更觉得有些突然 似乎金三银四和金九银四还没开始准备好 就匆匆过去 加上今年的大环境不佳 所以大部分的人在今年的招聘旺季都没有收获到好的结果 今天分享的主题则是由 一位阿里
  • sqli-labs通关攻略38-53[Stacked Injections]

    Stacked Injections 文章目录 Stacked Injections less 38 less 39 less 40 less 41 less 42 less 43 less 44 less 45 less 46 less
  • Vue 源码之Vue视图更新原理【一】

    写在前面 Vue React 可以说是这几年改变前端格局的大杀器 这部分更加高级的框架的出现 狠狠地推进了前端工程化的进度 也使前端能够更加快速 更加规范地完成业务的开发 秉承着底层架构者一贯遵循的执念 把复杂留给自己 无论是Vue 还是
  • picodet 详解

    picodet 详解 backbone ESNet picodet 详解 Neck CSP PAN
  • C++结构体的使用

    一 结构体指针 定义学生结构体 struct Student 成员列表 string name 年龄 int age 分数 int score 1 创建结构体变量 Student s 张三 18 100 2 通过指针指向结构体变量 因为变量
  • DC/DC:闭环控制的降压(Buck)变换电路原理设计及实验仿真

    在各种电力电子装置电源应用中或多或少地存在直流电源变换器 为保证直流输出电压值恒定在负载需要地电压范围内 一般需要设置自动调整单元 以保证在输入电压或者负载发生变换时 其输出电压能快速调整到规定的设定值 降压 Buck 变换电路原理图如图所
  • pandas异常值检测与处理

    关注公众号FF工作室 回复pandas异常值检测与处理 获取数据 1 异常值检测 1 1 标准差法 outlier gt x n 或outlier
  • 如何让移动硬盘在Mac和Windows上通用使用

    刚入手了一块新的移动硬盘 Mac电脑插上却发现一片空白无法使用 这是什么情况呢 原来一般一块新的大容量移动硬盘刚入手时 默认是NTFS格式 这是Windows的一种特有硬盘格式 但是Mac上只能读取不能写入 Mac和Windows上通用的格
  • Python 基础知识8 循环

    循环语句关键知识 while flag True num 0 while flag and num lt 9 print meng num 1 死循环 while True print ling range 函数 for i in rang
  • R语言填坑

    最近在做一个数据挖掘的算法 用到了R语言 对遇到的一些坑 基础知识 做一个简单记录 文件编码问题 脚本写完之后保存可以选择UTF 8或者GB2313 可以解决中文乱码问题 同样 读文件的时候如果出现读不出来的情况 记得加一个 encodin
  • linux查看剩余信息保护,linux系统日常管理----监控系统的状态(一)

    监控系统的状态 1 w查看当前系统的负载 相信所有的linux管理员最常用的命令就是这个 w 了 该命令显示的信息还是蛮丰富的 第一行从左面开始显示的信息依次为 时间 系统运行时间 登录用户数 平均负载 第二行开始以及下面所有的行 告诉我们
  • 西门子S7-1200控制伺服/步进电机方法与接线(全)

    西门子S7 1200控制伺服 步进电机方法与接线 全 伺服 步进电机在非标自动化控制中十分常用 但作者发现在各类开源网站上很少有人做西门子1200PLC控制伺服 步进电机的教程 于是今天想着跟大家分享一下 本文共分为一下几个四个内容 文章目
  • IDEA 如何搭建python环境

    首先打开idea 首先是file gt setting 然后点击Plugins 然后在Marketplace里面搜索python 然后点击Installed 最后再重启一下IDEA
  • 最优化六:牛顿法(牛顿法、拟牛顿法、阻尼牛顿法)

    牛顿法将目标函数近似为二阶函数 沿着牛顿方向进行优化 包含了Hession矩阵与负梯度信息 阻尼牛顿法在更新参数之前进行了一维搜索确定步长 确保沿着下降的方向优化 拟牛顿法用常数矩阵近似替代Hession矩阵或Hession矩阵的逆矩阵 不
  • GprMax的建模in文件编写详细解释

    一 in建模文件示例 gprMax http www gprmax com 是一款模拟电磁波传播的开源软件 它采用时域有限差分 FDTD 方法求解三维麦克斯韦方程组 gprMax是为模拟探地雷达 GPR 而设计的 但也可以用于模拟电磁波传播
  • 设计模式之组合模式

    组合模式 将对象组合成树形结构以表示 部分 整体 的层次结构 组合模式使得用户对单个对象和组合对象的使用具有一致性 class Program static void Main string args Composite root new
  • python 文件读取

    def read file 读取文件 file name test txt 打开文件 f open file name encoding utf 8 with open file name encoding utf 8 as f 读取文件内
  • 将Ubuntu 的文件映射到windows 中

    可以通过Samba服务器将VM 下安装的Ubuntu 的文件映射到windows系统下 从而实现在windows下对虚拟机中的文件进行编辑 1 sudo apt get install samba 安装samba服务器 2 vim etc
  • Scala中的集合(容器)元素

    1 列表List https blog csdn net hzp666 article details 115004788 2 vector 向量 https blog csdn net hzp666 article details 115
  • Java多线程(面试)

    一 程序 进程与线程 程序 Program 程序是一段静态代码 进程 Process 进程是指一种正在运行的程序 有自己的地址空间 特点 动态性 并发性 独立性 并发和并行的区别 并发 多个cpu同时执行多个任务 并行 一个cpu同时执行多