【面试专题】并发编程篇①
📃个人主页:个人主页
🔥系列专栏: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使用模块来表示神经网络。模块包括: 有状态计算的构建块。…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
