多线程之五分钟入门

多线程-实战优化 一. 回顾 关于线程相关的一些基础知识,本篇不再过多阐述,首先我们通过几个简单的问题,复习一下线程相关的一些基础知识。 1.进程和线程分别是什么? 进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 2.进程、线程的例子? 进程:运行的QQ、迅雷、Word等应用进程,进程是系统级别的 线程:QQ多个聊天窗口、迅雷下载多个文件等 3.线程的状态(生命周期) 线程的状态枚举:java.lang.T 阅读详情

 线程的基本概念

之前的硬件,只有一个CPU

之前的OS,只运行一个进程

随着多核CPU的出现,人们开始追求对CPU效率的极致压榨

多线程的程序随之诞生,但随之诞生的,也是非常难以应对的各种并发bug

 进程 线程

1. 什么是进程:资源分配的基本单位(静态概念)
2. 什么是线程:资源调度的基本单位(动态概念)
   通俗说:一个程序中不同的执行路径

**示例:什么叫做线程**

import java.util.concurrent.TimeUnit;

public class T01_WhatIsThread {
    private static class T1 extends Thread {
        @Override
        public void run() {
           for(int i=0; i<10; i++) {
               try {
                   TimeUnit.MICROSECONDS.sleep(1);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("T1");
           }
        }
    }

    public static void main(String[] args) {
        //new T1().run();
        new T1().start();
        for(int i=0; i<10; i++) {
            try {
                TimeUnit.MICROSECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("main");
        }

    }
}

观察上面程序的数据结果,你会看到字符串“T1”和“Main”的交替输出,这就是程序中有两条不同的执行路径在交叉执行,这就是直观概念上的线程,概念性的东西,理解就好,没有必要咬文嚼字的去背文字的定义。

为什么要写多线程程序

为了压榨CPU,提高资源利用率

#启动线程的5种方法

1. new MyThread().start()
2. new Thread(r).start()
3. new Thread(lamda).start()
4. ThreadPool
5. Future Callable and FutureTask

**认识几个线程的方法**

sleep() yield() join()

public class T03_Sleep_Yield_Join {
    public static void main(String[] args) {
					//testSleep();
					//testYield();
        testJoin();
    } 
		/*Sleep,意思就是睡眠,当前线程暂停一段时间让给别的线程去运行。Sleep是怎么复活的?由你的睡眠时间而定,等睡眠到规定的时间自动复活*/
    static void testSleep() {
        new Thread(()->{
            for(int i=0; i<100; i++) {
                System.out.println("A" + i);
                try {
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
		/*Yield,就是当前线程正在执行的时候停止下来进入等待队列(就绪状态,CPU依然有可能把这个线程拿出来运行),回到等待队列里在系统的调度算法里头呢还是依然有可能把你刚回去的这个线程拿回来继续执行,当然,更大的可能性是把原来等待的那些拿出一个来执行,所以yield的意思是我让出一下CPU,后面你们能不能抢到那我不管*/
    static void testYield() {
        new Thread(()->{
            for(int i=0; i<100; i++) {
                System.out.println("A" + i);
                if(i%10 == 0) Thread.yield();


            }
        }).start();

        new Thread(()->{
            for(int i=0; i<100; i++) {
                System.out.println("------------B" + i);
                if(i%10 == 0) Thread.yield();
            }
        }).start();
    }
		/*join, 意思就是在自己当前线程加入你调用Join的线程(),本线程等待。等调用的线程运行完了,自己再去执行。t1和t2两个线程,在t1的某个点上调用了t2.join,它会跑到t2去运行,t1等待t2运行完毕继续t1运行(自己join自己没有意义) */
    static void testJoin() {
        Thread t1 = new Thread(()->{
            for(int i=0; i<100; i++) {
                System.out.println("A" + i);
                try {
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(()->{

            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            for(int i=0; i<100; i++) {
                System.out.println("A" + i);
                try {
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

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

 

五分钟,说说Python 中多线程共享全局变量的问题 不好意思占用您的五分钟~❤ 阅读详情

相关推荐

java多线程访问数据库存在延迟十五分钟,如何解决??

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1313

多线程原理,实战

多线程Thread,Runable 线程的优先级,守护线程,线程合并join 线程退出stop与中断信号

weixin_57281267的博客 298

MATLABGUI读取文件并将路径显示在文本框中

MATLABGUI读取文件并将路径显示在文本框中

m0_50305149的博客 2649

多线程实战

线程简介 实现一个线程,必须创建一个thread实例,override run方法,并且调用start方法启动线程。 线程的生命周期分为new,runnable,running,block,termate. 1. 创建线程的方式 newThread的方式创建线程 线程池 1.1 new Thread new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).s

qq_42873640的博客 373

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 318

解决Thingsboard数据下发难题:自定义RPC请求格式的3种方法(含源码修改指南)

本文详细介绍了解决Thingsboard数据下发难题的3种自定义RPC请求格式方法,包括规则链脚本转换、TB-Gateway中间层转换和源码级定制方案。通过实际案例和性能对比,帮助开发者根据项目需求选择最适合的解决方案,提升物联网平台与设备的兼容性。

weixin_29008691的博客 232

多线程项目实战上篇

前言 有了前2篇多线程和线程池基础铺垫后,简单介绍一下多线程在项目中最常见的应用场景。 一、多线程应用 1.项目中哪些业务场景会用到多线程? 业务的并行处理和异步处理。 2. 如何在项目中使用多线程? 并行处理的业务一般会通过Callable和Future创建线程; 异步处理的业务一般会使用@Async注解打在方法上,使得方法异步执行业务。 3. 本篇需要了解多线程和线程池的基础,不清楚的可以去看看我之前的博客: 多线程基础 线程池基础 二、并行业务 1.业务场景 业务 订单详细

u010006156的博客 1786

SOC设计必看!Tessent DRC检查中最容易踩的5个坑(附解决方案)

本文针对SOC设计中Tessent DRC检查的常见问题,详细分析了5个最易忽视的陷阱,包括时钟域交叉、扫描链虚连、多电压域规则等,并提供专业解决方案。特别针对芯片设计中的DFT验证难点,分享了经过验证的调试方法和Tessent工具使用技巧,帮助工程师提升DRC检查效率。

weixin_29280657的博客 496

五分钟带你详细理解Java多线程

多线程 在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程。 在未配置 OS 的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完后,才允许另一个程序执行;在多道程序环境下,则允许多个程序并发执行。程序的这两种执行方式间有着显著的不同。也正是程序并发执行时的这种特征,才导致了在操作系统中引入进程的概念。 自从在 20 世纪 60 年代人们提出了进程的概...

weixin_44598691的博客 2057

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

本文介绍了WinForm开发中OpenFileDialog控件的关键属性及其应用。OpenFileDialog是.NET Framework提供的文件对话框控件,主要用于选择、打开文件操作。文章详细讲解了11个核心属性:AddExtension(自动补全扩展名)、AutoUpgradeEnabled(外观升级)、CheckFileExists/CheckPathExists(文件/路径存在验证)、DefaultExt(默认扩展名)、DereferenceLinks(解析快捷方式)、FileName/File

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1534

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

图像增强(Image Enhancement):指不考虑图像降质原因,利用各种数学方法和变换手段,增强图像中人们感兴趣部分或提高有用的图像特征的清晰度。从图像质量来看,图像增强提高了图像的可懂度,改善了图像的视觉效果例如在现实场景中,针对那些对比度较差、视觉效果不好的图像,我们就可以利用图像增强改善视觉质量图像增强可分为如下几种基于灰度级变换的图像增强基于直方图修正的图像增强基于照度反射模型的图像增强基于模糊技术的图像增强基于伪彩色处理的图像增强其他图像增强方法分段线性灰度级变换。

快乐江湖的博客 3331

Android OpenGL ES从入门到进阶(一)—— 五分钟开发一款美颜相机

带你十分钟开发一款美颜相机一、前言功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一、前言 在Android开发的众...

liuderong0的博客 6718

YOLOv8改进:卷积篇 | 保姆级探索动态蛇形卷积 (Dynamic Snake Convolution) 的实现与应用

动态蛇形卷积是一种新的卷积操作,它能够更好地捕捉图像中的细节信息。传统卷积核的形状和大小是固定的,而动态蛇形卷积则允许卷积核在不同的位置动态调整其形状,以更好地适应输入数据的特点。这种灵活性使得动态蛇形卷积在处理复杂背景和细节丰富的图像时具有显著优势。我们先定义一个基本的动态蛇形卷积模块。这个模块将作为YOLOv8卷积层的替代。为了全面集成动态蛇形卷积,我们需要修改YOLOv8的模型定义,将所有的基础卷积层替换为我们的SnakeConv模块。

一键难忘的博客 5480

五分钟带你入门线程

先欣赏个美景~~ 前言 我们在上一篇【学习并发先看这一介绍篇】大致汇总了整个多线程并发大概需要如何学习,这一篇开始真正的去开肝 我们从上一篇了解了线程和进程的一些区别,来回顾下 进程和线程的区别: 进程是操作系统资源分配基本单位,线程是操作系统资源分配最小单位 一个进程可以包含多个线程,一个进程中的多个线程可以共同完成 进程有自己的独立运行空间,程序切换进程开销大;线程可以看做轻量级进程,每个线程有自己的运行栈和PC程序计数器,线程切换开销小 一个进程崩溃后,在保护模式下不会对其它..

275

AUTOSAR汽车电子嵌入式编程精讲300篇-基于加密算法的车载CAN总线安全通信

随着科学技术的不断更新和社会文明的不断进步,汽车已经走入寻常百姓家, 成为当代社会必不可少的交通工具。伴随着互联网技术的飞速发展,汽车也不再 是一个简单的交通工具,已经逐渐发展成为一个集出行、通信、娱乐等功能于一 身的综合智能体,进而推动了车联网产业的蓬勃发展。车联网是在传统汽车的框架上安装了传感器、执行器、控制器等分布式和集 中式控制器,使汽车具备环境感知、协同控制、优化执行等功能,并通过网络技 术实现与车外环境的信息共享,给驾驶带来方便的同时也终将成为可以替代人操 作的新一代汽车[1-3]。

getusushu的博客 2590

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Hashtable程序员面试五分钟被请出来了

你们可能会想,栈长这么菜的吗?5分钟都坚持不了? 本文说起来会有点尴尬,毕竟这是栈长我曾经经历过的故事。 那时候的栈长还真菜,每天写着 if/ for 及一些简单的业务逻辑代码,虽工作有些日子了,但技术水平还停留在刚毕业的起步阶段。 记得,那是一个周末,栈长去某知名互联网公司面试,好像不到五分钟,我就被面试官亲切地赶出来了,当时我那个尴尬,内心深受打击。 为什么会被赶出来?这道题我记得很清楚,我...

a6984021的博客 676

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

DeepSeek小白入门:用AI助手五分钟写出你的第一个C语言爬虫

网络爬虫是一种按照一定规则自动抓取互联网信息的程序。它通过访问网页、解析内容,并按照预设的规则提取所需信息,广泛应用于搜索引擎、数据采集、信息监测等领域。对于初学者而言,理解爬虫的基本工作原理是构建自己的爬虫程序的第一步。URL队列:存储待爬取的URL网页下载器:负责从互联网下载网页内容网页解析器:从下载的网页中提取有用信息数据存储:将提取的信息存储到本地或数据库中DeepSeek是一款强大的AI助手,它能够根据用户的自然语言描述生成相应的代码片段。

2301_76277481的博客 1704

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

五分钟带你玩转多线程(一)java多线程基础知识简介

线程概念 进程:是一个执行中的程序,如打开网易云音乐,网易云音乐就是一个进程 线程:是进程的组成,一个进程包含多个线程,是jvm最小调度单元。如网易云音乐听歌是一个线程,评价是一个线程。 并发:就是多线程,当一个线程执行时 如果cpu有空闲了 就可以执行另一个线程 即使本线程没有结束,但是一个时间段只有一个线程在执行。比如:听歌时候能同时评论 并行:多个线程同时进行。真正的同时发生 为什...

小鲍侃java 751

五分钟快速理解 Reactor 模型

点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料本文将介绍基于进程/线程模型,服务器如何处理请求。值得说明的是,具体选择线...

朱小厮的博客 7341

五分钟了解Java多线程的基本概念

多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理” 。 一、生活中多线程的例子 城市发展: 乡村小道:可以理解为典型的单线程,当车流量较少时,可以正常同行,不会影响效率。 高速公路:..

m0_62222133的博客 122

五分钟Python速通

五分钟Python速通教学。 Python2.x分支的维护成本越来越高,因此决定在2008年发布Python3.0版本,以解决Python2.x的一些设计缺陷和限制,并提供更加清晰和一致的语言规范。while循环的本质是:当表达式的布尔结果为True时,则执行循环体,当然,对于无限循环(while True),在运用时需要注意,避免程序无法停止。在Python中,有着多种多样的GUI,可以轻松的写出各种各样的GUI程序,其中Tkinter是Python自带的一种简单易学的GUI库。

MoYeRanQianZhi的博客 1571
上一篇: 这 5 条 IntelliJ IDEA 调试技巧太强了
下一篇: 多线程之线程状态
zy_crazy_code
博客等级 码龄12年 290粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值