【面试专题】并发编程篇①
📃个人主页:个人主页
🔥系列专栏:Java面试专题
1.线程和进程的区别
线程和进程都是操作系统中的概念,它们的主要区别如下:
-
资源分配:进程是操作系统中的资源分配的基本单位,每个进程都有独立的内存空间、文件句柄等资源,而线程是进程中的一个实体,它与其他线程共享同一进程的资源。
-
调度:进程拥有自己的调度器,由操作系统负责进行调度,而线程则由进程的调度器进行调度,操作系统不能直接对线程进行调度。
-
运行效率:线程相比进程来说更加轻量级,创建和销毁的开销小,切换上下文也更快,因此线程的运行效率更高。
-
通信方式:进程之间的通信需要经过操作系统的管道或共享内存等机制,而线程之间可以直接共享同一进程的内存空间,因此线程间通信更加快捷。
2.并行与并发的区别
在多核CPU的情况下:
并发是同一时间应对多件事情的能力,例如:多个线程轮流使用一个CPU。
并行是同一时间动手做多件事情的能力,例如:4核CPU同时执行4个线程。
3.创建线程的方式有哪些
- 通过继承Thread类创建线程。需要重写run()方法,启动线程时,通过调用start()方法启动。
- 通过实现Runnable接口创建线程。需要重写run()方法,启动线程时,将自定义类的实例作为一个参数,调用Thread的构造方法,得到一个线程实例,再调用start()方法启动。
- 通过实现Callable接口创建线程。需要重写call()方法,启动线程时,需要新建一个Callable的实例,再用FutureTask实例包装它,最终再包装成Thread实例,调用start()方法启动,并且可以通过FutureTask的get()方法来获取返回值。
-
使用线程池,可以通过调用Executors类的静态方法创建线程池,然后向线程池中提交任务来创建线程。
4.Runnable和Callable有什么区别
-
Runnable不会返回结果或抛出异常,而Callable会返回结果或抛出异常。
-
Callable接口中定义的方法是call()方法,而Runnable接口中定义的方法是run()方法。
-
Callable可以通过Future接口来获取执行结果,而Runnable没有这样的机制。
-
Callable的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。
5.run()和start()有什么区别
-
run()方法定义了线程的主要内容,是实际执行的代码。但是,当使用run()方法时,代码执行在当前线程中,并没有创建新线程。可以被调用多次(就和普通方法一样)
-
start()方法启动一个新线程来执行run()方法中的代码。当使用start()方法时,代码将在新线程中执行,并且在主线程中继续执行其他代码。只能被调用一次。
6.线程包括那些状态
Java线程包括如下状态:
-
新建状态(New):当线程对象被创建时,它处于新建状态。
-
可执行状态(Runnable):当调用start()方法后,线程开始执行,进入可运行状态。可运行状态包括正在运行和就绪两种情况。
-
阻塞状态(Blocked):如果没有获取锁(synchronized或lock)进入阻塞状态,获得锁再切换为可执行状态
-
等待状态(Waiting):如果线程调用wait()方法进入等待状态,其他线程调用notify()唤醒后可以切换为可执行状态
-
计时等待状态(Timed Waiting):如果线程调用sleep(100)方法,进入计时等待状态,到时间后可切换为可执行状态
-
终止状态(Terminated):线程执行完成或者发生了未捕获的异常,进入终止状态。
7.新建T1、T2、T3三个线程,如何保证他们顺序执行
可以使用线程.join()方法来保证三个线程的顺序执行。具体实现方法如下:
public class Main { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { // 线程T1的代码 System.out.println("Thread T1"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { // 线程T2的代码 System.out.println("Thread T2"); } }); Thread t3 = new Thread(new Runnable() { @Override public void run() { // 线程T3的代码 System.out.println("Thread T3"); } }); // 启动线程,并使用join()保证顺序执行 t1.start(); t1.join(); // 等待t1执行完毕 t2.start(); t2.join(); // 等待t2执行完毕 t3.start(); t3.join(); // 等待t3执行完毕 }
}
8.notify()和notifyAll()有什么区别
notify()
和notifyAll()
都是Java中用于线程同步的方法,但它们的使用方式和作用有所不同。
notify()
:这个方法用于唤醒在此对象监视器上等待的单个线程。如果有多个线程在等待,它将唤醒其中一个线程。被唤醒的线程将获得锁,然后执行。notifyAll()
:这个方法用于唤醒在此对象监视器上等待的所有线程。当一个线程在对象上调用wait()
方法时,它会在那个对象上等待,直到其他线程在该对象上调用notify()
或notifyAll()
方法。当notifyAll()
方法被调用时,所有在该对象上等待的线程都会被唤醒,所有的这些线程将尝试获取锁,然后其中的一个将获得锁并执行。
简单来说,notify()
用于唤醒单个线程,而notifyAll()
用于唤醒所有等待的线程。在多线程编程中,合理使用这两个方法可以帮助我们更好地控制线程的执行顺序和同步。
9.在java中wait和sleep方法的不同
在Java中,wait()
和sleep()
方法都是用来暂停线程的执行,但是它们的使用方式和效果有很大的不同。
sleep()
方法:这个方法是Thread
类的一个静态方法。它会使当前线程暂停执行一段时间,这段时间内线程不会消耗CPU资源。在指定的时间间隔之后,线程会重新启动。注意,sleep()
方法需要一个参数,这个参数是线程暂停的时间,单位是毫秒。
Thread.sleep(2000); // 线程会暂停2秒
wait()
方法:这个方法是Object
类的一个成员方法。它会使当前线程等待,直到其他线程调用同一个对象的notify()
或notifyAll()
方法。在等待期间,线程不会消耗CPU资源。注意,wait()
方法需要在对象上调用,并且需要在一个同步上下文中。也就是说,它通常被包含在一个synchronized
块或者方法中。
synchronized (object) { while (<condition does not hold>) object.wait(); // perform action appropriate to condition
}
在这个例子中,线程会等待,直到<condition does not hold>
变为false
。然后,线程会继续执行。
总的来说,sleep()
和wait()
的主要区别在于:
sleep()
是静态方法,可以在任何地方调用,但它不会检查任何条件;而wait()
是对象的方法,必须在同步上下文中调用,它会检查一个条件并决定是否等待。sleep()
会导致线程阻塞一段时间,这段时间内线程不会消耗CPU资源;而wait()
会导致线程进入等待状态,直到其他线程调用同一个对象的notify()
或notifyAll()
方法。在这段时间内,线程不会消耗CPU资源。sleep()
和wait()
都需要一个时间参数,但是这个参数的含义不同。对于sleep()
,它是暂停的时间;对于wait()
,它是等待的最大时间(毫秒),如果在这个时间内没有接收到通知,那么线程会重新竞争锁并重新检查条件。
10.如何停止一个正在运行的线程
①使用一个标志位来通知线程可以安全地终止其执行
class MyThread extends Thread { private volatile boolean running = true; public void run() { while (running) { // ... do some work ... } } public void shutdown() { running = false; }
}
在这个例子中,当shutdown()
方法被调用时,线程将停止其执行。当然,线程应该定期检查running
变量的值,并在可能的情况下安全地退出循环。这样,线程就可以在适当的时候结束其执行。
②使用stop方法强行终止(不推荐,方法已经作废)
③使用interrupt方法中断线程
在Java中,你可以使用interrupt
方法来尝试中断一个线程。但是,你需要注意的是,interrupt
方法并不会立即终止线程,而是会设置一个中断标记,你需要在线程的中断处理代码中响应这个中断。
以下是一个简单的例子,说明如何中断一个线程:
public class MyThread extends Thread { public void run() { while (!Thread.currentThread().isInterrupted()) { // 线程的逻辑... } }
} public class Main { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); // 在需要的时候中断线程 myThread.interrupt(); }
}
在这个例子中,MyThread
类继承了Thread
,并重写了run
方法。在run
方法中,我们在循环中检查线程是否被中断。如果线程被中断,isInterrupted
方法会返回true
,这样我们就可以退出循环。
在主方法中,我们创建了一个MyThread
对象,并启动了线程。然后,我们使用interrupt
方法来中断线程。
请注意,这只是一个简单的例子。在实际的程序中,你可能需要在更复杂的逻辑中处理线程的中断。例如,如果你的线程是在一个阻塞操作(如Thread.sleep
或Object.wait
)中,那么当调用interrupt
方法时,线程会收到一个InterruptedException
。你需要在代码中处理这个异常,并响应中断。
相关文章:

【面试专题】并发编程篇①
📃个人主页:个人主页 🔥系列专栏:Java面试专题 1.线程和进程的区别 线程和进程都是操作系统中的概念,它们的主要区别如下: 资源分配:进程是操作系统中的资源分配的基本单位,每个进程…...

Linux Centos7安装后,无法查询到IP地址,无ens0,只有lo和ens33的解决方案
文章目录 前言1 查看network-scripts目录2 创建并配置 ifcfg-ens33 文件3 禁用NetworkManager4 重新启动网络服务总结 前言 在VMware中,安装Linux centos7操作系统后,想查询本机的IP地址,执行ifconfig命令 ifconfig结果如下: 结…...
行为型模式-访问者模式
在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就…...
go-kit中如何开启websocket服务
在Go-Kit中,可以使用github.com/go-kit/kit/transport/http包来开启WebSocket服务。以下是一个简单的示例代码,演示了如何在Go-Kit中开启WebSocket服务: package mainimport ("context""fmt""net/http""…...

私有网络的安全保障,WorkPlus Meet内网视频会议助力企业高效会议
在企业内部沟通与协作中,视频会议成为了一种必不可少的沟通方式。然而,传统的互联网视频会议往往受制于网络不稳定因素,给企业带来不便与困扰。WorkPlus Meet作为一款专注内网视频会议的软件,致力于为企业打造高效、稳定的内网视频…...

国际权威媒体聚焦:孙宇晨和波场TRON在迪拜荣获加密行业重磅奖项
近日,在迪拜举行的区块链生态大会(Blockchain Life Conference)上,波场TRON创始人、火币HTX全球顾问委员会委员孙宇晨斩获“年度加密企业家”称号,波场TRON荣膺“年度最佳 Layer 1”大奖。这一消息迅速得到彭博社、雅虎财经、美联社和法国最大媒体之一Le Figaro等国际权威媒体的…...
新闻详情。
<!DOCTYPE html> <html><head><title>新闻</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><lin…...
Java面试题-Redis-第二天(Redis持久化、过期键删除策略、内存淘汰策略)
目录 一、Redis持久化机制 二、Redis过期键删除策略 三、Redis内存淘汰策略 一、Redis持久化机制 为了能重用Redis数据,防止系统故障造成数据丢失,我们就需要将Redis中的数据写入到磁盘中,也就是持久化 1. 有哪些方式 有rdb和aof两种方式…...

ElasticSearch快速入门实战
全文检索 什么是全文检索 全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系统、电子…...

揭秘MySQL数据同步至Elasticsearch的最佳方案与技巧
本文介绍下当前常见的场景之一:Mysql数据同步Elasticsearch的实现方案,这里以电商为例,其实所有相关搜索内容都可以使用此方案。 对于搜索,应该是所有APP必备的基础功能,不同时期有不同的解决方案,本次重点…...

正点原子嵌入式linux驱动开发——Linux RTC驱动
RTC也就是实时时钟,用于记录当前系统时间,对于Linux系统而言时间是非常重要的,就和使用Windows电脑或手机查看时间一样,在使用Linux设备的时候也需要查看时间。本章就来学习一下如何编写Linux下的RTC驱动程序。 Linux内核RTC驱动…...

基于EasyCVR技术的大数据视频汇聚与智能分析平台设计方案
一、背景需求 大数据中心的数据建设如火如荼,针对其中城市中的视频监管及算法分析,各卡口监控、治安监控,电警监控不同网络、不同地域,如何进行视频融合、进行统一监管,则是大数据中心解决方案数据汇聚的重中之重。 现…...

骨传导耳机到底好用吗,到底骨传导耳机是不是噱头呢?
随着社会的飞速发展以及科技的不断提升,人们对健康的关注度也逐渐提高起来。而在这种背景下,骨传导耳机以其独特不可替代的优势,吸引了一大群骨传导爱好者的目光。 那么骨传导耳机是不是噱头呢?其实这种耳机不仅不会堵塞耳道&…...
bitsandbytes 遇到CUDA Setup failed despite GPU being available.
使用conda 管理环境时加载大模型会遇到bitsandbytes无法识别cuda的情况: 此处windows系统: pip install bitsandbytes-windowslinux 系统: 将bitsandbytes版本降低至0.39.0 pip install bitsandbytes0.39.0...

【机器学习】决策树与分类案例分析
决策树与分类案例分析 文章目录 决策树与分类案例分析1. 认识决策树2. 分类3. 决策树的划分依据4. 决策树API5. 案例:鸢尾花分类6. 决策树可视化7. 总结 1. 认识决策树 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最…...

基于物联网、大数据、云计算、人工智能等技术的智慧工地源码(Java+Spring Cloud +UniApp +MySql)
智慧工地是指利用物联网、大数据、云计算、人工智能等技术手段,为建筑施工现场提供智能硬件及物联网平台的解决方案,实现建筑工地的实时化、可视化、多元化、智慧化、便捷化。智慧工地的建设目标是实现全天候的管理监控,提高施工效率和质量&a…...

Py之pypdf:pypdf的简介、安装、使用方法之详细攻略
Py之pypdf:pypdf的简介、安装、使用方法之详细攻略 目录 pypdf的简介 pypdf的安装 pypdf的使用方法 1、基础用法 pypdf的简介 pypdf是一个免费的、开源的纯python PDF库,能够拆分、合并、裁剪和转换PDF文件的页面。它还可以为PDF文件添加自定义数据…...

谷歌Bard更新!会有哪些体验升级?
今年2月,谷歌的对话机器人Bard在发布会上翻车,遭到了科技圈的群嘲。如今半年过去了,Bard卷土重来,在9月发布了它的重磅更新“扩展插件”,集成了Gmail、Google Docs、Youtube 、Google Drive、Google Maps、Google Flig…...

[SHCTF 2023 校外赛道] reverse
week1 ez_asm 想不到第1题是个汇编,咱也不知道拿啥能弄成c,不过这题也不难,直接能看懂,关键部分。 取出异或0x1e然后保存,再取出-0xa再保存。 .text:0000000000401566 loc_401566: …...
pytorch:Model模块专题
一、说明 关于pytorch使用中,模块扮演重要校色,大部分功能不能密集展现,因此,我们这个文章中,将模块的种种功能详细演示一遍。 二、模块 PyTorch使用模块来表示神经网络。模块包括: 有状态计算的构建块。…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...