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中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其

随机推荐

  • 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同时执行多