java并发编程原理-----线程

news2024/11/22 23:32:44

目录

上下文切换

java代码创建线程的两种方式

线程的五个状态

线程join方法

多线程之间的影响


上下文切换

CPU的每一个核心同一时刻只能执行一个线程,但是我们会发现电脑同一时刻现实会进行几千个线程,这就是cpu在快速的切换执行线程,由操作系统进行选择要执行的线程

先是操作系统进行决定要执行那个任务,然后再交给CPU

线程执行达到操作系统分配的时间之后,会保存当前的执行状态,从任务保存到下次在加载的过程是一次上下文切换

任务之间的切换是有额外的时间开销的,这个开销不会到一毫秒

java代码创建线程的两种方式

一种是继承接口,一种是new出来

public class Demo2 implements  Runnable{
    @Override
    public void run() {
        for(;;){
            System.out.println("t2");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                for (;;){
                    System.out.println("t1");
                }
            }
        };
        Runnable x = new Demo2();
        Thread t2 = new Thread(x);

        t1.start();
        t2.start();

        for(;;){
            System.out.println("主线程");
        }
    }
}

线程的五个状态

  1. 新建状态(New):线程对象创建之后,但还没有开始执行。

  2. 就绪状态(Runnable):线程已经创建并且可以执行,但还没有获得CPU执行的机会。

  3. 运行状态(Running):线程正在执行任务。

  4. 阻塞状态(Blocked):线程暂时停止执行,因为它正在等待某个条件的发生(例如等待输入/输出完成、等待锁资源等)。

  5. 死亡状态(Dead):线程执行完其任务或被提前终止,进入结束状态。

细分为七种状态

线程执行的时候,什么时候执行和被分配到多少时间片都是不确定的,在windows中一般一次分配的时间是几毫秒到几十毫秒

线程join方法

加入了join方法后,线程A在执行到join方法的位置时会暂停,并等待线程B执行完毕后再继续执行。这样可以保证线程B的执行完成后,线程A再开始执行后面的代码。

如果两个线程都加上了join方法,它们之间的执行顺序不受对方的影响。它们会交替执行,具体的执行顺序取决于线程调度器的调度策略,以及线程的优先级设置。

需要注意的是,如果代码较短,在一个时间片内就执行完毕的情况下,可能不会明显地看到两个线程的交替执行。因为线程切换的时间损耗可能相对较大,而代码执行时间很短,线程可能会在很短的时间内执行完毕。

另外,join方法还可以传入一个可选的超时参数,指定等待的最长时间,如果超过该时间线程B还没有执行完毕,线程A会继续执行后续代码。

总而言之,使用join方法可以控制线程的执行顺序,确保某个线程在另一个线程执行完毕后再继续执行。但最终的执行顺序还是由线程调度器来决定,而且多线程的实际执行结果可能是不确定的,需要注意处理线程间的同步与共享资源的访问问题。

多线程之间的影响

多线程之间的影响可以包括以下几个方面:

  1. 竞争条件(Race Condition):当多个线程同时访问和修改共享数据时,由于执行顺序的不确定性,可能导致数据的不一致性。这种情况下,最终的结果可能与预期不符。

  2. 死锁(Deadlock):多线程程序中,如果线程之间存在循环等待资源的情况,就可能导致死锁。当发生死锁时,线程无法继续执行,导致程序无法正常运行。

  3. 数据竞争(Data Race):当多个线程同时读写共享数据时,可能会出现数据竞争的情况。如果没有正确的同步机制来保护共享数据,就可能导致数据的不确定性和错误。

  4. 上下文切换开销:多线程之间的切换需要保存和恢复线程的上下文信息,这个过程会带来一定的开销。当线程数量增多时,频繁的上下文切换可能会导致系统性能下降。

  5. 资源消耗:多线程程序可能会占用更多的系统资源,包括内存、CPU等。如果线程数量过多,可能会导致系统资源不足,影响整体性能。

为了避免多线程之间的影响,可以采取以下措施:

  1. 使用同步机制:例如互斥锁、信号量等,来保护共享数据的访问,避免竞争条件和数据竞争的发生。

  2. 避免死锁:设计合理的资源分配和释放策略,避免线程之间出现循环等待资源的情况。

  3. 使用线程安全的数据结构和算法:选择适合多线程环境的数据结构和算法,避免数据竞争和不一致性。

  4. 合理控制线程数量:根据实际需求和系统资源情况,控制线程的数量,避免过多的线程导致性能下降和资源消耗过大。

  5. 考虑使用线程池:通过线程池管理线程的创建和销毁,可以降低线程创建和上下文切换的开销,提高系统性能。

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

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

相关文章

Python中的迭代器

一、介绍 在Python中,迭代器是一种访问集合元素的方式,可以用于遍历数据集中的元素,而不需要事先知道集合的大小。迭代器可以被用于循环语句中,例如for循环,来遍历集合中的每个元素。 Python中的迭代器是一个实现了迭…

将Windows系统上的音频、视频通过iTunes传输到iPhone上

这个地方需要下载安装版的iTunes 下载地址: https://www.apple.com/itunes/download/win64 不要从Windows的APP Store中下载iTunes,不好使。 安装完成后,如果是导入一个文件夹中的资料,则点击 【文件】》【将文件夹添加到资料库】…

岛屿数量 (力扣) dfs + bfs (JAVA)

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的…

在内卷化竞争时代,金龙鱼重返增长的关键到底是什么?

提到欧丽薇兰、胡姬花、香满园、海皇、金味、丰苑、锐龙洁劲100、丸庄酱油等品牌,多数消费者的第一反应是什么?多数消费者认为是某个不知名的新品牌。问题的重点不在产品,而在主品牌定位。 事实上,这都是金龙鱼母公司益海嘉里旗下的品牌。内行都知道益海…

“坏邻居”导致的kafka生产者TPS下降原因排查

背景: 今天测试了两种不同的场景下kafka producer的tps性能数据,两种场景下都是使用3个线程,每个线程都是对应一个kafka producer,测试发送到kafka集群的消息的量,两个场景的区别是场景A只发送kafka消息,场…

自定义类型

目录 什么是自定义类型 结构体 结构体的声明 常规结构体的声明形式 特殊的结构体声明形式 匿名结构体: 匿名结构体的重命名: 注意事项: 结构体的自引用 什么是结构体的自引用 结构体变量的定义与初始化 方法一: 方法…

总结python安装包(库)过程中的采坑

绝大数的包比如numpy、pandas可以用pip install或者conda install解决,使用pip时可以用pip -V命令看一下自己的pip安装在了哪个虚拟环境,一般pip安装在哪默认就把python包安装在哪。 pip -VC:\Users\20478>pip -V pip 23.1.2 from D:\Python\lib\sit…

Android Java代码与JNI交互 JNI子线程访问Java方法 (八)

🔥 Android Studio 版本 🔥 🔥 创建包含JNI的类 JNIInvokeMethod.java 🔥 package com.cmake.ndk1.jni;import com.cmake.ndk1.base.ICallbackMethod; import com.cmake.ndk1.base.IThreadCallback;public class JNIInvokeMethod {static {System.loadLibrary("…

VBA代码如何切换word和excel(3)

【分享成果,随喜正能量】人不能因为一件好事,高兴一整年,却能因为一个创伤,郁郁终生。痛苦给人的刺激,总是远远大于快乐。成年人的烦恼,和谁说都不合适,悲喜自渡,他人难悟。人最强大…

DDOS防御,阻止DDoS攻击的15个独家技巧

DDoS攻击可以使企业完全宕机数小时以上,而宕机的后果可能很严重,各种规模的企业和政府都可能受到影响。2021年,由于系统中断一小时导致销售额大幅下降,亚马逊为此遭受了约3400万美元的直接财务损失。而随后由于Fakebook的服务中断…

Spring源码系列-第2章-后置工厂处理器和Bean生命周期

第2章-后置工厂处理器和Bean生命周期 后置工厂处理器属于后置处理器,后置处理器是Spring最核心的部分,Spring几乎所有的附加功能全由它完成。 什么是BeanPostProcessor? public interface BeanPostProcessor {/*** Apply this {code BeanPos…

桥接(Bridge)模式

目录 动机使用场景参与者优劣协作实现相关模式应用和思考 桥接模式是将抽象部分和它的实现部分分离,使他们都可以独立的变化的对象结构型模式。桥接模式通过将继承改为组合的方式来解决问题;具体来说就是抽取其中一个维度并使之成为独立的类层次。 动机…

gma 2 教程(二)数据操作:2. 功能逻辑架构和栅格数据类型简介

功能逻辑架构 gma栅格数据操作所含功能/属性的关系结构如下图所示: 栅格数据类型 gma栅格数据类型继承自GDAL,与NumPy数据关联,但又有所不同,详细关系见下表: 栅格格式支持 栅格格式信息统计 gma继承了GDAL全部的栅格…

详谈三次握手

作者:爱塔居 专栏:计算机网络 作者简介:大三学生,希望和大家一起进步 经过三次的对话,这两个火柴人才确认了双方都能够说话,都能听见。三次握手也是一样的,只要这样才能确认双方的接受与发送能力…

文件操作--按数据块读写文件

函数fread()和函数fwrite()用于一次读取一组数据,即按数据块读写文件。fread()的函数原型为: unsigned int fread(void *buffer ,unsigned int size,unsigned int count ,FILE *fp);…

raid5故障导致LeftHand存储崩溃的服务器数据恢复案例

HP-LeftHand存储简介: HP LeftHand存储支持RAID5、RAID6、RAID10磁盘阵列,支持卷快照,卷动态扩容等。 服务端: 客户端: LeftHand存储分为三个层级:物理磁盘、逻辑磁盘、逻辑卷。多个物理磁盘组成一个逻辑的…

pdf文档加水印怎么弄?用这款软件很方便

在工作中,我们经常需要将PDF文件发送给他人,但无法保证文件内容不被窃取,因此需要添加水印来保证文件的安全性。如果你不知道如何给PDF文件添加水印,以下两款软件可以帮助你轻松实现,一起来看看吧! 方法一&…

火爆全网,自动化测试-Allure完美测试报告(详全)卷起来...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、allure简介 A…

网络协议与攻击模拟-17-DNS协议-报文格式

二、DNS 查询 客户机想要访问www.baidu.com,根据自己的 TCP / IP 参数,向自己的首选 DNS 服务器发送 DNS 请求 首选 DNS 收到客户机的请求后,会去查询自己的区域文件,找不到www.baidu.com的 IP 地址信息(将请求转发到…

天池大赛中药说明书实体识别挑战冠军方案开源(二)部署运行实战 附详细操作说明

目录 Introduction 导言环境搭建环境 Github地址项目目录说明使用步骤下载预训练模型更改部分代码模型训练参数设置BERT-CRF模型训练BERT-SPAN模型训练BERT-MRC模型训练 运行训练预测复赛 test 文件 (上述模型训练完成后) 参考资料其它资料下载 Introduc…