每日后端面试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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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允许抛出异常,可以获取异常信息。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RISC-V走向开放服务器规范

原文&#xff1a;RISC-V Moving Toward Open Server Specification 作者&#xff1a;Agam Shah 转载自&#xff1a;https://www.hpcwire.com/2023/07/24/risc-v-moving-toward-open-server-specification/ 中文翻译&#xff1a; 2023年7月24日 RISC-V International目前正…

智安网络|恶意软件在网络安全中的危害与应对策略

恶意软件是指一类具有恶意目的的软件程序&#xff0c;恶意软件是网络安全领域中的一个严重威胁&#xff0c;给个人用户、企业和整个网络生态带来巨大的危害。通过潜伏于合法软件、邮件附件、下载链接等途径传播&#xff0c;破坏用户计算机系统、窃取敏感信息、进行勒索等不法行…

Vue3 表单输入绑定简单应用

去官网学习→表单输入绑定 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 表单输入绑定</h1><input type"text" placeholder"输入框" v-model"msg"…

好用的无线蓝牙耳机怎么选?七款真无线蓝牙耳机分享盘点

随着蓝牙技术的不断进步&#xff0c;近年来蓝牙耳机发展更是呈指数式上升阶段。蓝牙耳机凭借其携带便捷性以及摆脱线的缠绕而在外出必备数码产品中名列前茅&#xff0c;现如今在日常生活中随处可见的都有戴着蓝牙耳机的人&#xff0c;或是听歌、或是降噪、或是玩游戏等等&#…

未来C#上位机软件发展趋势

C#上位机软件迎来新的发展机遇。随着工业自动化的快速发展&#xff0c;C#作为一种流行的编程语言在上位机软件领域发挥着重要作用。未来&#xff0c;C#上位机软件可能会朝着以下几个方向发展&#xff1a; 1.智能化&#xff1a;随着人工智能技术的不断演进&#xff0c;C#上位机…

SpringBootWeb案例-准备工作

目录 前言 准备工作 需求&环境搭建 需求 环境搭建 开发规范 Restful开发规范 统一的响应结果 开发流程 前言 根据过往的文章可以知道目前我已经学习完了前端、后端、数据库的基础知识&#xff0c;接下来通过一个基于SpringBoot工程开发的web项目案例。 准备工作 …

BDA初级分析——先导课

思考题&#xff1a;假设你是三只松鼠营销团队的一员 美团or抖音&#xff1f;你会如何选择&#xff1f; 一、什么是数据分析 数据分析是根据业务问题&#xff0c;对数据进行收集、清洗、处理和建模的过程&#xff0c;用于识别有助于业务的信息&#xff0c;获取关键业务结论并辅…

《Linux运维实战:Docker基础总结》

一、简介 1、docker的基本结构是什么&#xff0c;包含哪些组件&#xff1f; docker的基本机构是c/s模式&#xff0c;即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信&#xff0c;发送容器管理…

从LeakCanary看Service生命周期监控

作者&#xff1a;小海编码日记 大家都知道使用LeakCanary可以监控项目中存在的 内存泄漏 问题&#xff0c;那么LeakCanary是怎么实现的呢&#xff1f;LeakCanary通过检测程序中对象的引用关系&#xff0c;收集应该被回收的对象并标记&#xff0c;随后等待GC后&#xff0c;检查该…

MFC第二十八天 WM_SIZE应用,CFrameWnd类LoadFrame的方法,PreCreateWindow窗口预处理,Frame-view窗口视图

文章目录 WM_SIZE应用通过WM_SIZE消息实现窗口布局管理通过控件属性实现窗口布局管理 CFrameWnd类CFrameWnd类简介OnCreate和OnCreateClient的方法注册时的要素与窗口设置PreCreateWindow创建窗口的预处理函数 附录预处理函数的结构体CFrameWnd::LoadFrame与CreateFrame WM_SIZ…

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测预测效果基本介绍研究内容程序设计参考资料…

2.若依前后端分离版第一个增删查改

1.介绍 若依提供了代码生成功能&#xff0c;单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统&#xff0c;进入菜单[系统工具]-》[代码生成],点击导入按钮&#xff0c;选择需要生成代码的表进行导…