每日后端面试5题 第三天

  1.  线程有哪几种状态以及各种状态之间的转换?(必会)

看图:

请添加图片描述
图片来自 线程状态转换图及其5种状态切换_小曹的blog的博客-CSDN博客
图片来自 总算把线程六种状态的转换说清楚了! - 知乎

线程一共有4种状态,分别是:

1.创建/新生状态new:被new出来了,还没start()。

2.就绪状态runable:start()了,待会去抢cpu。

  抢到了cpu就是传说中的第五种状态运行状态running。(说好的5种呢)

  这第六种的运行状态,运行的就是run()中的代码。

3.阻塞状态:运行run运行到一半,脾气一耍,不运行了,等条件蛮足了心情好了再运行。

   有三种情况:

1)等待waiting:玩wait()玩的

2)计时等待time waiting: sleep() 或 join()或发出了 I/O 请求搞的。

3)阻塞blocked:被synchronized锁了

4.死亡状态terminated:run里面代码跑完了,就死了

补充:start和run方法的区别

1.类型上,start是同步方法,run是非同步方法。 

2.作用上,run方法存放任务代码,start方法启动线程线程

3.对线程数量的影响方面,run不会产生新线程,start会产生新线程

4.调用次数方面,run方法可以被执行无数次,而star方法只能被执行一次,因为线程不能被重复启动

结合2、3点作用可以回答:

再补充:简述在main方法中运行线程的start方法和run方法,有什么区别,请看题:

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

public class TestThread {
    public static void main(String[] args) {
        Thread t0 = new MyThread();
        Thread t1 = new MyThread();

        Thread t2 = new MyThread();
        Thread t3 = new MyThread();

        t0.start();
        t1.start();

        System.out.println("=================================");

        t2.run();
        t3.run();
    }
}

以上代码的运行结果是什么样的?

A.

thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
... // t0和t1交替运行,打印0到99
thread-0 99
thread-1 99
=================================
thread-2 0 // t2.run()启动
thread-2 1
thread-3 0 // t3.run()启动
thread-3 1
... // t2run和t3run交替运行,打印0到99
thread-3 99
thread-2 99

 B.

=================================
thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
main 0 // t2.run()启动
main 1
... // t0、t1和t2run交替运行,打印0到99
thread-0 99
thread-1 99
main 99
main 0 // t3.run()启动
main 1
... // t3run运行,打印0到99
main 99

 C.

thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
... // t0和t1交替运行,打印0到99
thread-0 99
thread-1 99
=================================
main 0 // t2.run()启动
main 1
... // t2run运行,打印0到99
main 99
main 0 // t3.run()启动
main 1
... // t3run运行,打印0到99
main 99

D.

=================================
thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
main 0 // t2.run()启动
main 1
main 0 // t3.run()启动
main 1
... // t0、t1和t2run、t3run交替运行,打印0到99
thread-1 99
main 99
main 99
thread-0 99

 答案是B。原因需要结合上面的2、3点来理解。

2.作用上,run方法存放任务代码,start方法启动线程线程

3.对线程数量的影响方面,run不会产生新线程,start会产生新线程

再再补充:变种题

class MyThread extends Thread {
    @Override
    public void run() {
        synchronized (this) {  // 注意这里加了个线程锁
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
        }
    }
}

public class TestThread {
    public static void main(String[] args) {
        Thread t0 = new MyThread();
        Thread t1 = new MyThread();

        Thread t2 = new MyThread();
        Thread t3 = new MyThread();

        t0.start();
        t1.start();

        System.out.println("=================================");

        t0.run();  // 注意这里改成t0了
        t3.run();
    }
}

这个结果又是什么样的?注释掉打印分隔的等号呢:

public class TestThread2 {
    public static void main(String[] args) {
        Thread t0 = new MyThread();
        Thread t1 = new MyThread();

        Thread t2 = new MyThread();
        Thread t3 = new MyThread();

        t0.start();
        t1.start();
//        注意注释掉了打印等号分隔
//        System.out.println("=================================");

        t0.run();  // 注意这里改成t0了
        t3.run();
    }
}

再再再补充:变变种种题

代码如下:

public class MyRun implements Runnable {
    @Override
    public void run() {
        synchronized (this) {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
        }
    }
}

public class TestThread {
    public static void main(String[] args) {
        MyRun myRun = new MyRun();
        Thread thread0 = new Thread(myRun);
        Thread thread1 = new Thread(myRun);

        thread0.start();
        thread1.start();

        System.out.println("=================================");

        thread0.run();
    }
}

2.  什么是单例模式?有几种?

单例模式有5种:

1.饿汉式(Eager Initialization)

类加载的时候就创建。

优点:实现简单、线程安全,不会出现多线程问题;

缺点:实例没有被使用,就会造成资源浪费。

2.懒汉式(Lazy Initialization)

首次使用才创建。

优点:延迟实例化,节省了资源。

缺点:线程不安全。

3.双重检查锁(Double-Checked Locking)

懒汉式加同步锁。

优点:线程安全。

缺点:实现相对复杂,可能存在某些编译器和指令重排序的问题。

4.静态内部类(Static Inner Class)

放在静态内部类中,类加载时保证线程安全。

优点:线程安全且不依赖同步锁。

缺点:实现相对复杂,需要理解静态内部类的特性。

5.枚举(Enum)

用枚举类实现创建、保存单例实例。

优点:实现简单,线程安全,且能防止反射和序列化破坏单例。

缺点:不够灵活,不能延迟实例化。

饿汉的创建详细情况描述补充。

懒汉的创建详情描述补充。

饿汉加静态代码块、懒汉加同步方法的区别,研究这篇文章再补充:

单例模式的八种类型_单例有几种_神偷奶爸的博客-CSDN博客

3.  List 和 Map、Set 的区别

集合存储本质方式不同:

List和Set是单列集合,存储一种数据;Map是双列集合,存储键值对数据。

集合内部存储规律不同:

List内数据是有序的,并且可以重复;

Set内数据是无序的,且不可以重复;

Map内数据是无序的,键不能重复,值可以重复。

关于Set中位置的进一步解析

Set中的位置是固定的,但这没有顺序,还是无序的。

Set中元素的位置由hashcode决定,而这个是固定的。但这个是用户不能控制的,所以还算是无序的。

4.  使用HashMap集合储存数据,什么情况会产生hash冲突?

计算出的hashcode,即哈希值相同时,会产生hash冲突。

5.   Runnable 和 Callable 的区别?

返回上:

Runnable无返回值;Callable有返回值。

异常处理上:

Runnable只能抛出运行时异常,且无法捕获处理;Callable允许抛出异常,可以获取异常信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/73936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【日常积累】RPM包依赖下载及私有yum仓库搭建

概述 某些时候&#xff0c;我们需要下载某个RPM包依赖的依赖。如某些内网环境&#xff0c;就需要自行准备rpm包。可以通过能上互联网的服务器进行相应的rpm包下载&#xff0c;然后在拷贝到相应的服务器安装&#xff0c;或者搭建自己的内容rpm包仓库。 查看*.rpm 包依赖&#…

分布式系统监控zabbix安装部署以及使用

文章目录 分布式系统监控zabbix安装部署及使用一.zabbix监控1.什么是zabbix2.zabbix功能3.zabbix的构成4.zabbix的3种架构4.1 C/S架构4.2 分布式架构&#xff1a;zabbix-proxy-client架构4.3 master-node-client架构 5.zabbix工作原理及数据流向6.zabbix监控模式 二.zabbix部署…

41、可靠传输——停等ARQ

前面两节内容我们学习了传输层的基本概况的一些知识&#xff0c;包括传输层在TCP/IP协议栈中负责的任务、传输层的两大协议&#xff0c;以及端口号、套接字等一些基本的概念。从这一节开始&#xff0c;我们将开启两大协议中TCP协议的学习。 但是&#xff0c;经过之前的学习&am…

Kotlin语法

整理关键语法列表如下&#xff1a; https://developer.android.com/kotlin/interop?hlzh-cn官方指导链接 语法形式 说明 println("count ${countnum}")字符串里取值运算 val count 2 var sum 0 类型自动推导 val 定义只读变量&#xff0c;优先 var定义可变变量…

shell之正则表达式及三剑客grep命令

一、正则表达式概述 什么是正则表达式&#xff1f; 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式&#xff0c;又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符&#xff1a; 大小写字母…

【云原生】K8S存储卷:PV、PVC详解

目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;ku…

ReBel 论文学习笔记

论文&#xff1a;《Combining Deep Reinforcement Learning and Search for Imperfect-Information Games》 地址&#xff1a;https://arxiv.org/abs/2007.13544v2 代码&#xff1a;https://github.com/facebookresearch/rebel 材料&#xff1a; BV1gt4y1k77C&#xff08;1小时…

Linux 当fork在for循环中的问题

以下代码会打印几个"A"&#xff1f; 例1.代码如下&#xff1a; int main(int argc, char* argv[],char* envp[]) { for(int i 0;i < 2; i ) { fork(); printf("A\n"); } exit(0); } 代码分析&#xff1a; //父进程for(int i …

算法笔试 java 输入输出练习

在线编程题刷题训练 所有答案 scancer函数的用法 输入输出总结top&#xff01;&#xff01;&#xff01;&#xff01; java如何调用函数&#xff08;方法&#xff09; java刷acm的各种输入输出 vscode配置java环境 子函数的调用&#xff0c;直接定义一个static子函数调用就…

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一个通配符&#xff08;*&#xff09;或一个占位符&#xff08;:&#xff09;来捕获 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

编译OpenCV问题解决:已经编译OpenCV成功之后无法运行测试代码

报错问题如下&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2001 无法解析的外部符号 "void __cdecl cv::imshow(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class c…

【校招VIP】测试计划之黑盒测试白盒测试

考点介绍&#xff1a; 黑盒测试&白盒测试是大厂和三四线公司校招的必考点。黑盒是以结果说话&#xff0c;白盒往往需要理解实现逻辑。现在商业项目的接口测试往往以白盒为主&#xff0c;也就是需要测试同学自己观察和修改数据库的值进行用例的测试。 但是无论采用哪种测试方…

自然语言处理: 第七章GPT的搭建

自然语言处理: 第七章GPT的搭建 理论基础 在以transformer架构为框架的大模型遍地开花后&#xff0c;大模型的方向基本分成了三类分别是: decoder-only架构 , 其中以GPT系列为代表encoder-only架构&#xff0c;其中以BERT系列为代表encoder-decoder架构&#xff0c;标准的tr…

关于Java中synchronized的实现原理

并发编程的三个理念 原子性&#xff1a;一个操作要么全部完成&#xff0c;要么全部失败。可见性&#xff1a;当一个线程对共享变量进行修改后&#xff0c;其他线程也应立刻看到。有序性&#xff1a;程序按照顺序执行 synchronized基本使用 修饰静态方法&#xff0c;锁的是类…

时序预测 | Matlab实现基于RF随机森林的电力负荷预测模型

文章目录 效果一览基本介绍模型描述源码设计学习小结参考资料效果一览 基本介绍 时序预测 | Matlab实现基于RF随机森林的电力负荷预测模型 电力负荷预测是指通过对历史电力负荷数据分析,来预测未来某个时间段内的电力负荷需求。这项预测对于电力系统的运行和调度至关重要,可以…

【Echart地图】jQuery+html5基于echarts.js中国地图点击弹出下级城市地图(附完整源码下载)

文章目录 写在前面涉及知识点实现效果1、实现中国地图板块1.1创建dom元素1.2实现地图渲染1.3点击地图进入城市及返回 2、源码分享2.1 百度网盘2.2 123云盘2.3 邮箱留言 总结 写在前面 这篇文章其实我主要是之前留下的一个心结&#xff0c;依稀记得之前做了一个大屏项目的时候&…

【Sklearn】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于决策树算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理1.1 模型原理1.2 数学模型 2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 决策树是一种基于树状结构的分类和回归模型&#xff0c;它通过一系列…

C++ QT(一)

目录 初识QtQt 是什么Qt 能做什么Qt/C与QML 如何选择Qt 版本Windows 下安装QtLinux 下安装Qt安装Qt配置Qt Creator 输入中文配置Ubuntu 中文环境配置中文输入法 Qt Creator 简单使用Qt Creator 界面组成Qt Creator 设置 第一个Qt 程序新建一个项目项目文件介绍项目文件*.pro样式…

【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 现在是传输层&#xff0c;在应用层中的报文(报头 有效载荷)就不能被叫做报文了&#xff0c;而是叫做数…

【Sklearn】基于最中心分类器算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于最中心分类器算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 最近中心分类器&#xff08;Nearest Centroid Classifier&#xff09;也被称为近似最近邻…