【Java面试】十六、并发篇:线程基础

文章目录

  • 1、进程和线程的区别
  • 2、并行和并发的区别
  • 3、创建线程的四种方式
    • 3.1 Runnable和Callable创建线程的区别
    • 3.2 线程的run和start
  • 4、线程的所有状态与生命周期
  • 5、新建T1、T2、T3,如何保证线程的执行顺序
  • 6、notify和notifyAll方法有什么区别
  • 7、wait方法和sleep方法有什么不同
  • 8、如何停止一个正在运行的线程
    • 8.1 使用退出标志
    • 8.2 调用stop方法
    • 8.3 调用interrupt方法

1、进程和线程的区别

在这里插入图片描述

  • 一个程序或者应用被运行,就是开启了一个进程(应用.exe背后的代码被从磁盘加载到内存)
  • 一个进程下,包含了多个线程,分别处理着不同的任务
  • 线程更轻量,上下文成本切换更低(上下文切换即从一个线程切换到另一个线程)

2、并行和并发的区别

  • 并行:多项工作一起执行,下班后,你收拾屋子,你对象做饭。与其相反的就是串行,即一步一步来,或者一件一件事情的做。(4核CPU同时执行4个线程)

在这里插入图片描述

  • 并发:多个工作换着处理,下班后,你屋子收拾一半后,去准备做饭,菜准备好后又回去接着收拾屋子(多个线程轮流使用一个或者多个CPU)

补充:操作系统中,有个任务调度器,将CPU时间片(比如15毫秒)分给不同的程序使用。CPU在线程间的切换速度很快,给人的感觉就是同时运行的。

在这里插入图片描述

并发是一个人同时吃三个馒头(一张嘴,第一个馒头吃一口,转身再吃一口第二个馒头),而并行是三个人同时吃三个馒头(三个人各吃各的,好比多核CPU各自执行指令)。

最后,并发在后端层面上,也指同一时刻,多个线程在访问同一个资源,多个线程对一个点,对应的例子: 春运抢票、电商秒杀

3、创建线程的四种方式

  • 继承Thread类

在这里插入图片描述

  • 实现Runnable接口

在这里插入图片描述

  • 实现Callable接口,Callable的泛型即重写的call方法的返回值类型

在这里插入图片描述

  • 线程池创建线程

在这里插入图片描述

3.1 Runnable和Callable创建线程的区别

  • Runnable 接口 run 方法没有返回值
  • Callable 接口 call 方法有返回值,是个泛型,和 Future、FutureTask配合可以用来获取异步执行的结果
  • Callable 接口的 call 方法允许抛出异常,而 Runnable 接口的run 方法的异常只能在内部try-catch消化,不能继续上抛

3.2 线程的run和start

  • start方法是用来启动线程的,通过该线程调用执行run方法,只能被调用一次
  • run方法里面封装了要被线程执行的代码,是一个普通方法,可以被调用多次
public class ThreadTest {public static void main(String[] args){Thread t1 = new Thread("t1") {@Overridepublic void run() {System.out.println("running...");}};t1.run();t1.run();t1.start();t1.start();}

调用两次run方法:
在这里插入图片描述
调用两次start方法:

在这里插入图片描述

4、线程的所有状态与生命周期

JDK源码中的线程状态枚举值:

在这里插入图片描述

状态流转:
  • NEW:新建状态,创建出一个Thread对象

  • Runnable:可执行状态,执行start方法,此时如果抢到了CPU时间片,那就去执行run方法,然后线程进入终止状态(死亡)

  • Blocked:没抢不到锁(lock、synchronized),进入阻塞状态,抢到锁后切换为Runnable状态

  • Waiting:调用了wait方法,进入等待状态,其他线程调用notify方法后被唤醒,进入Runnable状态
    在这里插入图片描述

  • Timed_Waiting:计时等待状态,线程调用了sleep方法,sleep时间过后进入Runnable状态

流转图:
在这里插入图片描述

5、新建T1、T2、T3,如何保证线程的执行顺序

thread.join();

以下,t2线程中执行t1.join,即等待t1线程执行完成后,再执行t2

在这里插入图片描述

6、notify和notifyAll方法有什么区别

notify是随机唤醒一个wait的线程,notifyAll是唤醒所有wait的线程。

如下,object对象上wait了两个线程t1、t2

在这里插入图片描述
notify时,只随机唤醒了一个object对象上wait的线程

在这里插入图片描述

7、wait方法和sleep方法有什么不同

共同点:

  • wait和sleep都会让当前线程暂时放弃CPU时间片的使用权,进入阻塞状态

不同点:

1)方法归属不同:

  • sleep是Thread类的静态方法
  • wait是Object类的静态方法,每个对象都有

2)醒来时机不同:

  • 执行sleep(long time) 和 wait(long time) 的线程,在相应毫秒过后会自己醒来进入就绪状态
  • wait(long time)wait() 都可以被 notify 唤醒,且wait() 如果不被唤醒就一直等待
  • sleep和wait都可以被打断唤醒

3)锁的特性不同:

  • 调用wait方法,必须先获取wait方法所在对象的锁,否则IllegalMonitorStateException,sleep则不用获取任何锁
  • wait对象执行后,会释放其占有的对象锁,其他线程可抢这个锁(放弃CPU时间片、放弃对象锁)
  • sleep如果是在synchronized代码块里,sleep并不会释放synchronized抢到的对象锁(放弃CPU时间片,如果有锁也不会放弃)

8、如何停止一个正在运行的线程

8.1 使用退出标志

加一个标记字段,改了标记之后,线程return,结束执行

class MyRun implements Runnable {boolean flag = false;public void run() {for (int i = 0; i < 100; i++) {if (! this.flag) {System.out.println(Thread.currentThread().getName() + "--->" + i);System.out.println(this.run);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}} else {System.out.println("这是一些终止线程前要做的事");System.out.println("保存数据中..终止线程成功!");return;}}}
}
public class ThreadTest2 {public static void main(String[] args) {MyRun r = new MyRun();Thread t = new Thread(r);t.start();//sleep主线程三秒try{Thread.sleep(3000);}catch(InterruptedException e){e.printStackTrace();}//终止,改run属性为truer.run = true;}
}

在这里插入图片描述

8.2 调用stop方法

sleep方法已作废

MyThread myThread = new MyThread();
myThread.start();
//强制终止
myThread.stop();

8.3 调用interrupt方法

  • 打断正在阻塞的线程(sleep、wait、join),线程会抛出InterruptedException异常
public class MyInterrupt {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{System.out.println("t1 正在运行...");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}, "t1");t1.start();Thread.sleep(500);t1.interrupt();System.out.println(t1.isInterrupted());}
}

在这里插入图片描述

  • 打断正常线程,改变线程的中止标志位,是否退出由线程自己决定,思路上和方式一相似
public class MyInterrupt {public static void main(String[] args) throws InterruptedException {Thread t2 = new Thread(()->{while(true) {Thread current = Thread.currentThread();boolean interrupted = current.isInterrupted();if(interrupted) {System.out.println("打断状态:"+ interrupted);break;}}}, "t2");t2.start();Thread.sleep(500);t2.interrupt();}
}

如上,主线程中调用t2.interrupt(),t2线程的中止标志位变为true,但是否中止执行,看 t2 线程自己,上面t2线程自己判断标志位为true时,就break结束循环

在这里插入图片描述

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

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

相关文章

QT-轻量级的笔记软件MyNote

MyNote v2.0 一个轻量级的笔记软件&#x1f4d4; Github项目地址: https://github.com/chandlerye/MyNote/tree/main 应用简介 MyNote v2.0 是一款个人笔记管理软件&#xff0c;没有复杂的功能&#xff0c;旨在提供便捷的笔记记录、管理以及云同步功能。基于Qt 6.6.3 个人开…

MATLAB入门知识

目录 原教程链接&#xff1a;数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 前言 历史记录 脚本文件&#xff08;.m&#xff09; Matlab帮助系统 注释 ans pi inf无穷大 -inf负无穷大 i j虚数单位 eps浮点相对精度 0/&a…

Edge浏览器视频画中画可拉动进度条插件Separate Window

平时看一些视频的时候&#xff0c;一般需要编辑一些其他的东西&#xff0c;于是开启画中画&#xff0c;但是画中画没有进度条&#xff0c;需要大幅度的倒退前进得回到原视频&#xff0c;很麻烦。这里推荐插件Separate Window&#xff0c;可实现画中画进度条拉动和播放sudu的调节…

Transparent 且 Post-quantum zkSNARKs

1. 引言 前序博客有&#xff1a; SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇 上图摘自STARKs and STARK VM: Proofs of Computational Integrity。 上图选自&#xff1a;Dan Boneh 斯坦福大学 CS251 Fall 2023 Building a SNARK 课件。 SNARK…

工业通讯现场中关于EtherCAT转TCPIP网关的现场应用

在当今工业自动化的浪潮中&#xff0c;EtherCAT技术以其高效、实时的特性成为了众多制造业的首选。然而&#xff0c;随着工业互联网的发展&#xff0c;对于数据的远程访问和云平台集成的需求日益增长&#xff0c;这就需要将EtherCAT协议转化为更为通用的TCP/IP协议。于是开疆智…

kafka-消费者-消费异常处理(SpringBoot整合Kafka)

文章目录 1、消费异常处理1.1、application.yml配置1.2、注册异常处理器1.3、消费者使用异常处理器1.4、创建生产者发送消息1.5、创建SpringBoot启动类1.6、屏蔽 kafka debug 日志 logback.xml1.7、引入spring-kafka依赖1.8、消费者控制台&#xff1a;1.8.1、第一次启动SpringK…

日进2000,我怎么做到的

昨天遇到一个有意思的项目&#xff0c;让我一天进账2000&#xff0c;一个字&#xff1a;爽。 这几天接洽了一位新客户&#xff0c;主要诉求就是优化系统&#xff0c;基于LNMP的系统优化。正好这个领域我比较熟悉&#xff0c;以前都是在公司做项目&#xff0c;也不怎么涉猎系统优…

HCIP-Datacom-ARST自选题库_10_其他判断【23道题】

1.端到端时延等于路径上所有处理时延与队列时延之和。 2.部署PPP Multilink之后&#xff0c;数据将根据源地址和目的地址均匀的分配在各条成员链路上。 3.流镜像分为本地流镜像和远程流镜像两种方式。√ 4.IP报文中用Tos字段进行Q0S标记&#xff0c;Tos字段中是使用前6bit来…

知识图谱的应用---智能电网

文章目录 智能电网典型应用 智能电网 智能电网以物理电网为基础&#xff0c;将现代先进的传感测量技术、通讯技术、信息技术、计算机技术和控制技术与物理电网高度集成而形成的新型电网。它以充分满足用户对电力的需求和优化资源配置、确保电力供应的安全性、可靠性和经济性、满…

2024.6.9 四

Python的异常处理 在python里,错误和异常是不同的概念 错误: Python 的语法错误或者称之为解析错,大多是因为写代码写错了出现的 异常: 即便 Python 程序的语法是正确的&#xff0c;在运行它的时候&#xff0c;也有可能发生错误。运行期检测到的错误被称为异常。 大多数的异常…

Ajax 快速入门

Ajax 概念&#xff1a;Ajax是一种Web开发技术&#xff0c;允许在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新网页的部分内容。 作用&#xff1a; 数据交换&#xff1a;Ajax允许通过JavaScript向服务器发送请求&#xff0c;并能够接收服务器响应的数据。 异…

STM32H750启动和内存优化(分散加载修改)

前些日子有个朋友一直给我推荐STM32H750这款芯片&#xff0c;说它的性价比&#xff0c;说它多么多么好。于是乎&#xff0c;这两天试了试&#xff0c;嚯&#xff0c;真香&#xff01;我们先看看基本配置 这里简单总结下&#xff0c;cortex-m7内核&#xff0c;128k片内flash …

HTML-CSS练习例子

HTML CSS 练习 https://icodethis.com 作为前端练习生。不敲代码只看&#xff0c;入门是很慢的&#xff0c;所以直接实战是学习前端最快的途径之一。 这个网站练习HTML CSS的&#xff0c;可以打开了解一下&#xff0c;可以每天打卡&#xff0c;例子简单&#xff0c;循序渐进&…

Python第二语言(六、Python异常)

目录 1. 捕获异常&#xff08;try: except: else: finally:&#xff09; 1.1 概念 1.2 基础语法&#xff08;try&#xff1a; except&#xff1a;&#xff09; 1.3 捕获异常&#xff08;异常也有类型&#xff09; 1.4 捕获多个异常&#xff08;try&#xff1a;except(Name…

基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道

作者&#xff1a;尹航 在前文《基于阿里云服务网格流量泳道的全链路流量管理&#xff08;一&#xff09;&#xff1a;严格模式流量泳道》、《基于阿里云服务网格流量泳道的全链路流量管理&#xff08;二&#xff09;&#xff1a;宽松模式流量泳道》中&#xff0c;我们介绍了流…

大数据数仓的数据回溯

在大数据领域&#xff0c;数据回溯是一项至关重要的任务&#xff0c;它涉及到对历史数据的重新处理以确保数据的准确性和一致性。 数据回溯的定义与重要性 数据回溯&#xff0c;也称为数据补全&#xff0c;是指在数据模型迭代或新模型上线后&#xff0c;对历史数据进行重新处理…

开源多平台AI音乐生成器本地安装结合cpolar内网穿透实现远程访问

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统电脑上快速本地部署一个文字生成音乐的AI创作工具MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用。 MusicG…

基于stm32最小版的超声波测距模块

目录 一、模块准备 二、HC-SR04模块原理解释 三、程序完整代码 四、烧录结果 总结 一、模块准备 STM32F103C8T6 HC-SR04 ST-Link&#xff08;其他烧录器也可以&#xff09; 0.96寸OLED屏幕&#xff08;非必须&#xff0c;仅供显示测距结果&#xff0c;可以使用串口助手代替…

nodejs最新某东h5st(4.7.2)参数分析与javascript逆向纯算法还原(含算法源码)(2024-06-09)

一、作者声明&#xff1a; 文章仅供学习交流与参考&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除&#xff01; 二 、写在前面 h5st从4.1一路更新到4.7.2&#xff0c;逐渐vmp…

66. UE5 RPG 实现远程攻击武器配合角色攻击动画

在制作游戏中&#xff0c;我们制作远程攻击角色&#xff0c;他们一般会使用弓箭&#xff0c;弩&#xff0c;弹弓等武器来进行攻击。比如你使用弓箭时&#xff0c;如果角色在播放拉弓弦的动画&#xff0c;但是弓箭武器没有对应的表现&#xff0c;会显得很突兀。所以&#xff0c;…