JUC总结1

线程和进程的对比

进程是操作系统资源分配的最小单位,其包含了进程控制块、程序、数据等,在电脑上启动的一个个应用程序就是进程,当一个程序要被运行时,从磁盘中将这个应用程序的代码加载到内存中,就开启了一个进程。

线程是调度的基本单位,即CPU资源分配的基本单位,一个进程中包含了多个线程,如Java程序启动后,会开启一个main线程。

对于不同的进程,使用不同的内存空间,而同一进程中的线程,共享内存空间。对于同一个进程中线程的上下文切换,比进程上下文切换效率更高。

线程创建的方式

1、继承Thread类,重写run方法,启动线程时调用start方法(注意run方法返回值为void,不能改成其他类型);

2、调用Runnable接口,重写run方法,创建Thread类,并在创建Thread类时,将调用了Runnable接口的类作为参数进行传入,要启动线程则要通过所创建的Thread类调用start方法。

3、调用Callable接口,并重写call方法,其中call方法有返回值,且为泛型,需要指定返回的类型,调用Callable时也需指定类型。要启动线程,首先需创建调用了Callable接口的对象,并将所创建的对象作为参数创建FutureTask,其中FutureTask需指定类型,该类型即为call方法返回值的类型,最后传入所创建的FutureTask对象创建Thread对象,通过start方法调用,大致流程代码如下:

 CallableTask task = new CallableTask();//CallableTask实现了Callable接口FutureTask<String> futureTask = new FutureTask<>(task);Thread thread = new Thread(futureTask);thread.start();

4、线程池创建,通过Executors.newFixedThreadPool(n)定义一个大小为n的线程池,得到ExecutorService对象,然后通过调用submit方法启动线程,其中在调用submit方法时,需要传入实现了Runnale接口的类,可通过shutdown方法关闭线程池。

Runnale和Callable对比

1、Runnale中的run方法无返回值,而Callable中的call方法有返回值且是泛型;

2、Callable方法支持返回执行的结果,通过FutureTask.get方法来获取,此方法会阻塞正在执行的线程,若不调用则不会阻塞;

3、Callable的call方法可以抛出异常,而Runnable的run方法不能抛出,只能内部消化。

start和run方法的区别

当调用start方法时,会创建一个新的线程,执行run方法,run方法在新线程中执行,从而达到了多线程的效果;如果直接调用run方法,则run方法在当前线程中执行,不能实现多线程。run方法可被调用多次,而start方法只能被调用一次。

线程的各种状态

1、NEW:初始状态,此时线程被创建但未调用start方法启动,此时未与操作系统底层的线程产生联系;

2、Runnale:运行状态,包含了READY就绪、RUNNING运行中两种状态,其中对于就绪状态的线程,可通过系统调度的方式将线程转化为运行中状态,对于运行中的线程,可通过系统调用或yield方法将其转化为就绪状态。

3、BLOCKED:阻塞状态,当线程获取锁失败时,会进入阻塞状态,此时线程不占用cpu资源。当其他线程释放锁时,会按照一定的规则从阻塞队列中唤醒线程,被唤醒的线程进入运行状态。

4、WAITING:等待状态,该状态的线程需要等待其他线程做出特定动作,此时线程不占用cpu资源。当其他持有锁的线程调用notify或notifyAll方法时,会按一定的规则唤醒处于等待状态的线程,对于运行状态的线程,可通过调用Thread.join()、Thread.wait()方法进入等待状态。

5、TIME_WAITING:超时等待,与等待状态不同,该状态的线程会在一定时间后返回,该状态的线程不占用cpu资源。处于运行状态的线程,可通过调用Object.sleep(time)、Thread.join(time)、Thread.wait(time)这些指定时间的方法进入等待状态,当时间到后线程转化为运行状态,当其他持有锁的线程调用notify或notifyAll方法时,会按一定的规则唤醒这些处于等待状态的线程。

6、TERMINATED:终止状态,线程执行结束后会进入该状态。

保证线程执行顺序方法

可通过join关键字,保证多个线程的执行顺序性,如下列代码:

Thread t = new Thread(()->{try {t1.join(); } catch (InterruptedException e) {e.printStackTrace();}System.out.println("1");
});

代码中的t1.join()表示线程t需要在t1执行结束后才能执行。

sleep和wait对比

使用sleep、wait均可以使线程暂时放弃cpu,进入阻塞状态,线程执行sleep、wait在等待期间若被中断,则会抛出InterruptedException异常

但也有以下不同:

1、sleep属于Thread类,wait属于Object类;

2、执行sleep(long)、wait(long)的线程可在指定的时间被唤醒,其中wait(long)可被notify或notifyAll方法唤醒,而wait()方法如果不被唤醒,则会一直等待下去;

3、线程执行wait方法后会释放锁,执行sleep方法后不会释放锁;

4、sleep方法可在任意地方被调用,wait方法使用的前提是当前线程必须持有对该对象的锁,必须在同步方法或同步代码块中执行,否则会抛出IllegalMonitorStateException异常。

如何终止线程

1、使用退出标识,线程在run方法执行结束后正常退出;

2、使用stop方法强行停止,但这种方法不推荐,因为 stop 方法会导致线程立即停止,可能会在不一致的状态下释放锁,破坏对象的一致性,导致难以发现的错误和资源泄漏;

3、使用interrupt方法,对于线程t,执行代码t.interrupt(),可终止线程t。同时isInterrupted方法可检查当前线程是否中断,interrupted方法可在检查线程是否被中断的同时,在线程被中断的情况下清除中断标志。

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

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

相关文章

音乐系统java在线音乐网站基于springboot+vue的音乐系统带万字文档

文章目录 音乐系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 音乐系统 一、项目演示 在线音乐系统 二、项目介绍 基于springbootvue的前后端分离在线音乐系…

【Python设计模式14】状态模式

状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。状态模式将不同状态的行为封装到不同的状态类中&#xff0c;使得状态之间的转换独立于对象本身&#xff0c;减少了条件语句的使用&#xff0c;提高了代…

Design and implementation of robot impedance controller

机器人阻抗控制器的设计与实现是一个复杂但关键的过程&#xff0c;它涉及到多个方面以确保机器人能够在外界环境的影响下保持稳定的性能。以下是对机器人阻抗控制器设计与实现的详细解答&#xff1a; 一、阻抗控制原理 阻抗控制的基本原理是建立一个期望的机器人位置和接触力…

股票交易vip快速通道有什么门槛?vip交易通道的开通流程!

证券公司的VIP通道通常是为了满足高端客户或高频交易客户的需求而设立的&#xff0c;提供更快速、更便捷的交易服务。证券公司VIP通道适用于有追涨停板需求的投资者&#xff0c;以及一些喜爱高频交易的投资者&#xff0c;总的来说就是快速&#xff0c;在交易主机排队靠前。 VI…

go-zero 实战(1)

环境准备 go 版本 go version go1.22.2 linux/amd64 goctl 安装 goctl&#xff08;官方建议读 go control&#xff09;是 go-zero微服务框架下的代码生成工具。使用 goctl 可以显著提升开发效率&#xff0c;让开发人员将时间重点放在业务开发上&#xff0c;其功能有&#xff1a…

pands使用openpyxl引擎实现EXCEL条件格式

通过python的openpyxl库&#xff0c;实现公式条件格式。 实现内容&#xff1a;D列单元格不等于E列同行单元格时标红。 #重点是formula后面的公式不需要“”号。 from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles.differential import Dif…

Java客户端SpringDataRedis(RedisTemplate)上手

文章目录 ⛄概述⛄快速入门❄️❄️导入依赖❄️❄️配置文件❄️❄️测试代码 ⛄数据化序列器⛄StringRedisTemplate⛄RedisTemplate的两种序列化实践方案总结 ⛄概述 SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…

LLM学习笔记

Q1&#xff1a;SFT时&#xff0c;计算LOSS ​ LLM是自回归生成模型&#xff0c;每次只会生成一个 token&#xff0c;难道 SFT 时&#xff0c;对于一个 (L, D) 的数据&#xff0c;要调用 L 次LLM去计算loss&#xff1f; A1&#xff1a; ​ 在每个前向传播过程&#xff0c;模型…

HDU 2196 Computer(树形dp)

H D U 2196 C o m p u t e r &#xff08;树形 d p &#xff09; \Huge{HDU 2196 Computer&#xff08;树形dp&#xff09;} HDU2196Computer&#xff08;树形dp&#xff09; 文章目录 题意思路标程 题目链接&#xff1a;Problem - 2196 (hdu.edu.cn) 题意 给出一个n个节点的无…

论AI大模型炼丹与练舞的关系

AI大模型的训练和微调的区别&#xff0c;就像是在舞蹈中学习基础动作和编排新的舞蹈一样。 想象一下&#xff0c;你有一个神奇的舞蹈机器人&#xff0c;只要给它足够的舞蹈视频&#xff0c;它就能学会各种各样的舞步。 模型训练的过程就像是给这个舞蹈教练机器人一个包含了各种…

git将某次提交合并到另一个分支

一、需求背景 将分支b中的某一次提交单独合并到分支a 二、实现方案 需求&#xff1a;将分支b中的某一次提交单独合并到分支a 1.在git上查看指定某次提交的id&#xff0c;如下图所示&#xff1a; 也可以通过git log命令查看提交的id&#xff0c;如下图&#xff1a; git log…

CNN网络的介绍及实战

卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习模型&#xff0c;它在计算机视觉领域取得了巨大成功。CNN的设计灵感来自于生物学中的视觉系统&#xff0c;旨在模拟人类视觉处理的方式。CNN由多层卷积层和池化层堆叠而成&…

【AIGC调研系列】MiniCPM-Llama3-V2.5模型与GPT-4V对比

MiniCPM-Llama3-V2.5模型与GPT-4V的对比可以从多个方面进行分析&#xff0c;包括性能、应用场景和技术特点。 从性能角度来看&#xff0c;MiniCPM-Llama3-V2.5在OCR识别、模型幻觉能力和空间理解能力方面表现出色&#xff0c;实现了开源模型的性能SOTA&#xff08;State of th…

Android13 基座充电屏保

屏幕保护有两个设置可选&#xff1a;默认为插入基座充电时 通过DreamBackend启用屏保&#xff0c;并且保存选择的时机 //QSSI.13\packages\apps\Settings\src\com\android\settings\dream\WhenToDreamPicker.java Override protected boolean setDefaultKey(String key) {mBac…

LeetCode hot100-50-G

124. 二叉树中的最大路径和二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根…

linux input 驱动

使用文档 设备树修改 新增一个 LED 节点 arch/arm/boot/dts/arm/vexpress-v2p-ca9.dts my_pl_led {compatible = "arm, cortex-a9-led";status = "okay";};设备树编译 make dtbs日志 DTC arch/arm/boot/dts/arm/vexpress

AI视频换脸!最快的方法,100%成功,完全免费,无需配置、打开即用

这是一款百分百完全免费&#xff0c;超级好用又简单的AI视频换脸工具&#xff0c;不仅效果非常不错而且支持CPU和GPU解码&#xff0c;即使电脑上没有独立显卡&#xff0c;你也可以通过电脑上的CPU要进解码&#xff0c;虽然我之前给他介绍好几个有关AI视频&#xff0c;比如像这个…

通关!游戏设计之道Day17

音乐里的音符 音乐能给任何娱乐体验增色不少。 主题公园景区&#xff0c;电影或电子游戏都少不了它。 在考虑音乐设计时&#xff0c;你需要弄清楚的第一个问题是&#xff1a;“我想要什么类型的音乐&#xff1f;” 关于这个问题&#xff0c;确切的答案有两个&#xff1a;用…

46. 全排列 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a;方法、集合、泛型、Arrays工具类、数组、for循环、if判断 Python&#xff1a; 方法、列表、for循环、if判断 题目&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案…

网络原理-HTTPS协议

在前面说到HTTP中,我们通过抓包,可以看到许多信息内容,其中往往会包含一些敏感信息,这些都是明文传输,当我们的请求被黑客或者不法分子截获后,那就很危险了,因此衍生出了HTTPS协议来对传输数据进行加密。 一、加密原理 基本原理如下&#xff1a; 明文 密钥 > 密文 密文…