Java岗面试题--Java并发(日积月累,每日三题)
目录
- 面试题一:并行和并发有什么区别?
- 面试题二:线程和进程的区别?
- 追问:守护线程是什么?
- 面试题三:创建线程的几种方式?
- 1. 继承 Thread 类创建线程,重写 run() 方法
- 2. 实现 Runnable 接口创建线程,实现 run() 方法
- 追问:Runnable 和 Callable 有什么区别?
- 补充:FutureTask
面试题一:并行和并发有什么区别?
- 并行是指两个或者多个事件在同⼀时刻发⽣;而并发是指两个或多个事件在同⼀时间间隔发⽣;
- 并行是在不同实体上的多个事件,并发是在同⼀实体上的多个事件;
- 在⼀台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如 Hadoop 分布式集群。所以并发编程的目标是充分的利⽤处理器的每⼀个核,以达到最⾼的处理性能。
面试题二:线程和进程的区别?
进程:是程序运行和资源分配的基本单位,⼀个程序至少有⼀个进程,⼀个进程至少有⼀个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更⾼。
- 举个例子,当我们双击桌面的图标时,系统会将对应的程序加载进内存,程序将会占用一部分内存用以执行操作。进入到内存的程序即为进程(一个应用程序可以同时运行多个进程)。当使用任务管理器关闭程序时(比如LOL),系统又会将程序从内存中清除,此时进程结束。如图:一个 LOL 进程。
-
线程:是进程的⼀个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同⼀进程中的多个线程之间可以并发执行。
需要注意的是,Java 本身并不能创造线程,因为线程其实是操作系统的一种资源,它由操作系统管理。我们一般说“Java 支持多线程”,指的就是 Java 可以调用系统资源创建多线程。

追问:守护线程是什么?
用户线程:我们平常创建的普通线程。
守护线程(即 Daemon thread),是个服务线程,用来服务于用户线程,准确地来说就是服务其他的线程。 在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出。
守护线程怎么使用:使用很简单,只是在调用start()方法前,调用 setDaemon(true) 把该线程标记为守护线程。
- 如何检查一个线程是守护线程还是用户线程:使用isDaemon()方法。
- Java垃圾回收线程就是一个典型的守护线程,因为我们的垃圾回收是一个一直需要运行的机制,但是当没有用户线程的时候,也就不需要垃圾回收线程了,守护线程刚好满足这样的需求。
面试题三:创建线程的几种方式?
1. 继承 Thread 类创建线程,重写 run() 方法
public class ThreadDemo1 extends Thread {public static void main(String[] args) {// ThreadDemo 继承了Thread类,并重写run()ThreadDemo t = new ThreadDemo();// 开启线程:t线程得到CPU执行权后会执行run()中的代码t.start();}@Overridepublic void run() {System.out.println("Thread is running");}
}
2. 实现 Runnable 接口创建线程,实现 run() 方法
public class ThreadDemo2 implements Runnable{public static void main(String[] args) {// ThreadDemo2实现Runnable接口,并实现run()ThreadDemo2 target = new ThreadDemo2();// 调用Thread构造方法,传入TreadDemo2的实例对象,创建线程对象Thread t = new Thread(target);// 开启线程:t线程得到CPU执行权后会执行run()中的代码t.start();}public void run() {System.out.println("Thread is running");}
}
- 通过 Callable 和 Future 创建线程;
- 通过 线程池 创建线程。
追问:Runnable 和 Callable 有什么区别?
- Runnable 接口中的 run() 方法的返回值是 void,它做的事情只是纯粹地去执行 run() 方法中的代码而已; run方法不可以抛出异常。
- Callable 接口中的 call() 方法是有返回值的,是⼀个泛型,和 Future、FutureTask 配合可以用来获取异步执行的结果。call方法可以抛出异常。
补充:FutureTask
未来的任务,用它就干一件事,异步调用 main 方法就像一个冰糖葫芦,一个个方法由 main 串起来。
但解决不了一个问题:正常调用挂起堵塞问题。
例子:
- 老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水,水买回来了放桌上,我需要的时候再去get。
- 4个同学,A 算1+到20,B 算21+到30,C 算31*到40,D算41+到50,是不是 C 的计算量有点大啊,FutureTask 单起个线程给 C 计算,我先汇总 ABD,最后等 C 计算完了再汇总 C,拿到最终结果。
- 高考:会做的先做,不会的放在后面做 。
原理:在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给 Future 对象在后台完成,当主线程将来需要时,就可以通过 Future 对象获得后台作业的计算结果或者执行状态。 一般 FutureTask 多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。 仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。 只计算一次 get 方法放到最后。
public class CallableDemo {public static void main(String[] args) {FutureTask<Integer> futureTask = new FutureTask<Integer>(() -> {System.out.println(Thread.currentThread().getName() + " come");return 1024;});new Thread(futureTask,"AAA").start();try {System.out.println(futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}运行结果:
AAA come
1024
相关文章:
Java岗面试题--Java并发(日积月累,每日三题)
目录面试题一:并行和并发有什么区别?面试题二:线程和进程的区别?追问:守护线程是什么?面试题三:创建线程的几种方式?1. 继承 Thread 类创建线程,重写 run() 方法2. 实现 …...
Prometheus监控案例之blackbox-exporter
blackbox-exporter简介 blackbox-exporter项目地址:https://github.com/prometheus/blackbox_exporter blackbox-exporter是Prometheus官方提供的一个黑盒监控解决方案,可以通过HTTP、HTTPS、DNS、ICMP、TCP和gRPC方式对目标实例进行检测。可用于以下使…...
Makefile基础使用和实战详解
Makefile基础使用和实战详解一、基础1.1、简单的Makefile1.2、多文件编译1.3、伪对象.PHONY二、变量2.1、自动变量2.2、特殊变量2.3、变量的类别2.4、变量及其值的来源2.5、变量引用的高级功能2.6、override 指令三、模式四、函数4.1、addprefix 函数4.2、filter函数4.3、filte…...
Go基础-变量
文章目录1 Go中的变量2 声明一个变量3 声明变量并初始化4 变量推断5 声明多个变量5.1 多个变量相同类型5.2 多个变量不同类型6 简短声明7 Go语言变量不能把一种类型赋值给其他类型1 Go中的变量 Go中变量指定了某存储单元的名称,该存储单元会存储特定类型的值&#…...
【算法】三道算法题目单词拆分,填充每个节点的下一个右侧节点指针以及组合总和
算法第一道算法题:单词拆分java解答参考第二道算法题:填充每个节点的下一个右侧节点指针java 解答参考第三道算法题:组合总和java解答参考大家好,我是小冷。 今天还是继续学习算法技术知识吧 第一道算法题:单词拆分 …...
【算法】刷题路线(系统+全面)
本系列基于当前各大公司对大公司的考察情况,给大家规划一条可行的算法刷题路线,大概会规划 200 道自认为有用的题,并且争取让初学者,能够刷起来更加丝滑,而且每个阶段都会进行相对应的说明。 当然,无论是面…...
Fiddler的报文分析
目录 1.Statistics请求性能数据 2.检测器(Inspectors) 3.自定义响应(AutoResponder) 1.Statistics请求性能数据 报文分析: Request Count: 1 请求数,该session总共发的请求数 Bytes …...
Spring 中,有两个 id 相同的 bean,会报错吗
我们知道,spring容器里面的bean默认是单例的,所以id是唯一的。但是需要注意,同一类型的bean可以有不同的id,比如有id1->bean,也可以有id2->bean。 下面再来详细回答一下文章的问题。 首先,在同一个…...
Mysql数据库的时间(4)一查询数据库时间注意点
一.select根据时间段查询 1.原始的sql根据时间段查询 select * from stu where time between "1998-09-01" and "1999-09-01"; //查询从1998-09-01到1999-09-01时间段的数据 等同于select * from stu where time >"1998-09-01" and time &l…...
一起学 pixijs(2):修改图形属性
大家好,我是前端西瓜哥。 我们做动画、游戏、编辑器,需要根据用户的交互等操作,去实时地改变图形的属性,比如位置,颜色等信息。今天西瓜哥带大家来看看在 pixijs 怎么修改图形的属性。 因为 pixijs 的底层维护了图形…...
LeetCode 121. 买卖股票的最佳时机
原题链接 难度:easy\color{Green}{easy}easy 题目描述 给定一个数组 pricespricesprices ,它的第 iii 个元素 prices[i]prices[i]prices[i] 表示一支给定股票第 iii 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同…...
shell脚本内调用另外一个shell脚本的几种方法
有时会在一个shell脚本(如test_call_other_shell.sh)中调用另外一个shell脚本(如parameter_usage.sh),这里总结几种可行的方法,这些方法在linux上和windows上(通过Git Bash)均适用: 1.通过source: 运行在相同的进程,在test_…...
Linux C++ 多进程下write写日志问题思考
文章目录多个进程(父子)同时通过write像日志文件中写,是否会出现数据混乱情况?需要满足以下条件: 1、通过open打开文件,子进程都是复制父进程的文件描述符去操作这个文件,不会造成文件混乱&…...
MySQL的四种事务隔离级别
目录一、事务的基本要素(ACID)1、原子性(Atomicity):2、一致性(Consistency):3、隔离性(Isolation):4、持久性(Durability)…...
方法区和元空间有什么关系?
一.什么是方法区? 方法区属于是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。 《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,方法区到底要如何实现那就是虚拟机自己要考虑的事情了。也就是说,在…...
2023VNCTF的两道(暂时)
from http://v2ish1yan.top/2023/02/19/%E6%AF%94%E8%B5%9Bwp/2023vnctf/ 比赛的时候在回学校的路上,所以没有打,听说质量挺高,赛后做一下 象棋王子 一个普通的js游戏,玩过关了就给flag,所以flag肯定在前端源码里 这…...
JDK版本区别
1. 泛型 ArrayList listnew ArrayList()------>ArrayList<Integer>listnew ArrayList<Integer>(); 2 自动装箱/拆箱 nt ilist.get(0).parseInt();-------->int ilist.get(0);原始类型与对应的包装类不用显式转换 3 for-each i0;i<a.length;i------------&…...
Android 基础知识4-2.8 TableLayout(表格布局)详解
一、TableLayout的概述 表格布局是以行数和列数来确定位置进行排列。就像一间教室,确定好行数与列数就能让同学有序入座。 注意:我们需要先添加<TableRow容器,每添加一个就会多一行,然后再往<TableRow容器中添加其它组件。…...
SQL代码编码原则和规范
目录1、先了解MySQL的执行过程2、数据库常见规范3、所有表必须使用Innodb存储引擎4、每个Innodb表必须有个主键5、数据库和表的字符集统一使用UTF86、查询SQL尽量不要使用select *,而是具体字段7、避免在where子句中使用 or 来连接条件8、尽量使用数值替代字符串类型…...
【博客627】gobgp服务无损变更:graceful restart特性
gobgp服务无损变更:graceful restart特性 场景 当我们的bgp网关在对外宣告bgp路由的时候,如果我们网关有新的特性要发布,那么此时如果把网关停止再启动新版本,此时bgp路由会有短暂撤回再播出的过程,会有网络抖动 期待…...
Unity IL2CPP热更新实战:动态库与global-metadata.dat的无缝替换方案
1. IL2CPP热更新的核心挑战 在移动游戏开发中,热更新能力直接决定了产品的运维效率和用户体验。传统的Mono运行时支持Assembly动态加载,而IL2CPP作为Unity的AOT编译方案,将C#代码转换为C后编译为原生二进制,这带来了性能提升却牺…...
正则表达式实战:精准校验日期时间格式的五大场景
1. 为什么我们需要校验日期时间格式? 在日常开发中,数据校验是最基础也最容易出问题的一环。就拿日期时间来说,你可能遇到过用户把"2023年2月30日"这种不存在的日期提交到系统,或者日志文件里的时间戳格式五花八门&…...
避开这些坑!Anthropic Computer Use在Mac上的安全使用指南(含Streamlit界面优化技巧)
避开这些坑!Anthropic Computer Use在Mac上的安全使用指南(含Streamlit界面优化技巧) 在Mac上探索AI工具的边界时,Anthropic Computer Use无疑是一把双刃剑。它既能让你通过自然语言指令操控整个系统,也可能因权限过高…...
Qwen3-4B-Thinking效果展示:递归算法设计、时间复杂度分析与优化建议生成实例
Qwen3-4B-Thinking效果展示:递归算法设计、时间复杂度分析与优化建议生成实例 1. 模型效果惊艳展示:一个会“思考”的代码助手 最近在测试一个特别的文本生成模型——Qwen3-4B-Thinking。这个名字听起来就很有意思,“Thinking”这个词让我很…...
nli-distilroberta-base零基础上手:非算法工程师也能部署的逻辑推理服务
nli-distilroberta-base零基础上手:非算法工程师也能部署的逻辑推理服务 1. 项目介绍 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)服务,专门为没有算法背景的开发者设计。它能帮你快速判断两个句子之间的逻辑关系ÿ…...
别再只盯着通用数据集了!盘点2024年那些能直接拿来微调LLaMA、ChatGLM的医学问答数据集
2024医学大模型实战:精选可直接微调的问答数据集与应用指南 当开源大模型如LLaMA-3、ChatGLM3和Gemma在通用领域展现出惊人潜力后,医疗健康领域正成为下一个技术落地的黄金赛道。但许多工程师在兴奋地下载完模型权重后,却卡在了最关键的一环—…...
Colmap避坑指南:如何用SuperPoint+SuperGlue提升三维重建精度(附错误案例修复)
Colmap三维重建精度提升实战:从特征匹配优化到工业级解决方案 在计算机视觉领域,三维重建技术已经从实验室走向工业应用,而Colmap作为开源摄影测量工具链的核心,其重建精度直接决定了后续NeRF或Gaussian Splatting等神经渲染技术的…...
Qwen3-TTS-VoiceDesign参数详解:Temperature与Top P加点调优指南
Qwen3-TTS-VoiceDesign参数详解:Temperature与Top P加点调优指南 你是不是也遇到过这样的问题:用AI生成语音时,明明输入了“开心的语气”,出来的声音却平淡得像在念说明书?或者想要“悲伤一点”,结果听起来…...
绵羊行为检测数据集2276张VOC+YOLO格式
绵羊行为检测数据集2276张VOCYOLO格式数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2276 标注数量(xml文件个数):2276 标注数量…...
驱动开发的常用工具
2.3.3 驱动开发的常用工具 嵌入式驱动开发涉及硬件调试、软件调试、代码编译等多个环节,掌握合适的工具可以大幅提升开发效率。本节将系统介绍驱动开发中常用的四大类工具:交叉编译工具链、调试工具、开发板与仿真器、文档与源码工具,并结合RK3588平台给出具体的使用方法。…...
