多线程学习——入门篇

c++ 多线程学习入门篇精讲(1) 目录 基本概念C++中的多线程示例1:创建线程并执行函数 示例2:传递参数给线程函数示例3:使用Lambda表达式 线程同步什么是线程同步?为什么需要线程同步?(1)数据竞争(Data Race)的例子(2)不一致状态(Inconsistent State)的例子数据竞争和不一致状态的区别 尝试手动加锁解决问题手动实现锁的问题C++ 中的线程同步机制示例4:使用std::mutex进行线程同步(补充)关于emplace_back与 push_back 的区别(补充)关于基于范围的for循环(补充)关于aut 阅读详情

前言:想成为一名优秀的程序员,线程这个重要的知识点一定要掌握。

一、什么是线程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。——百度百科

撇开调度不说,进程就是应用程序在内存中分配的空间,java启动main方法就是启动了一个JVM的进程,JVM内存模型如图,而main方法又是此进程中的一个线程,又称主线程。
 

图1

例:把内存比作一块地,春天了,赵家村要搞一次种地运动,村长为南区分配一块地,配置水源,工具区。张三兴致勃勃的去种地了。
如果种地任务太多,靠张三一个人速度会很慢,把张三累死了,这次运动也就失败了,因此就需要加一些人共同来种,大家每人一亩,互不影响,这样效率就高很多了。
此场景中线程就是一个种地的人。

二、线程的创建与运行

1. 继承Thread类

public class ThreadDemo {

    public static class TillThread extends Thread {
        @Override
        public void run() {
            //分配任务
            System.out.println("种地");
        }
    }

    public static void main(String[] args) {
        //创建一个线程
        Thread 张三 = new TillThread();
        //开始执行任务
        张三.start();
    }
}

2. 实现Runnable接口

public class ThreadDemo {

   public static class TillThread implements Runnable {
       @Override
       public void run() {
           //分配任务
           System.out.println("种地");
       }
   }

   public static void main(String[] args) {
       //创建一个任务
       TillThread 种地 = new TillThread();
       //创建一个线程
       Thread 张三 = new Thread(种地);
       //开始执行任务
       张三.start();
   }
}

3. 实现Callable类

public class ThreadDemo {

    public static class TillThread implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("种地");
            return "种了一亩地";
        }
    }

    public static void main(String[] args) {
        //创建一个任务
        TillThread tillThread = new TillThread();
        FutureTask<String> tillTask = new FutureTask<>(tillThread);
        //创建一个线程
        Thread 张三 = new Thread(tillTask);
        张三.start();
        try {
            String result = tillTask.get();
            System.out.println(result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

这种方式可以获取到这个线程的返回值。

4. 如何选择

在这里插入图片描述

我们可以看到Thread也是实现的Runnable接口,考虑到java“单继承,多实现”的特性,使用实现Runnable接口的方式更加灵活。

三、常用的方法

1. 静态方法

  • Thread.currentThread(); ——获取正在执行的线程对象的引用。
  • Thread.sleep(1000); ——使当前线程睡眠1秒。

2. 普通方法

  • thread.setName(); ——设置线程的名字。
  • thread.getName(); ——获取线程的名字。
  • thread.start(); ——执行线程的任务。
  • thread.join(); ——使当前线程等待thread执行完毕后在执行。

3. 注意

多线程编程中常用的wait()和notify()是Object中的方法。

四、synchronized关键字

我们通常使用Synchronized关键字给某一段代码上锁。被上锁的代码块同一时间只能有一个线程执行。

1. 什么时候需要上锁

还是上面的例子,麦子熟了,但是南区只有一台收割机,这个时候如果张三和李四都使用那肯定是没法实现的,所以只能张三收割完李四再收割了。可以说当有资源需要排队使用时需要使用到锁。

2. 上锁的方式

Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。

    // 关键字在实例方法上,锁为当前实例
    public synchronized void instanceLock() {
        
    }

    // 关键字在静态方法上,锁为当前Class对象
    public static synchronized void classLock() {
        
    }

    // 关键字在代码块上,锁为括号里面的对象
    public void blockLock() {
        Object o = new Object();
        synchronized (o) {
            
        }
    }

注:Java类只有一个Class对象(可以有多个实例对象,多个实例共享这个Class对象),而Class对象也是特殊的Java对象。所以我们常说的类锁,其实就是Class对象的锁。

2. 使用时需要注意的问题

  1. synchronized是重量级的锁
  2. javaSE1.6后对synchronized进行了优化,所以我们放心使用。

五、思考

使用时上锁的三种方式该如何选择呢?jdk中那些地方用到了这几种方式呢?

GB28181学习之路——eXosip多线程 多线程开发的主要的工作就是就是使用多个eXosip_t int i,j; TRACE_INITIALIZE (6, NULL); m_ctx1 = eXosip_malloc(); m_ctx1 = eXosip_malloc(); if (m_ctx1==NULL || m_ctx2==NULL) { FLOG("eXosip_malloc failed\n"); return -1; } i=eXosi. 阅读详情

相关推荐

支付宝H5支付唤醒协议全解析:从alipays://到动态orderSuffix的抓取与拼接

本文深入解析支付宝H5支付唤醒协议,从alipays://协议设计到动态orderSuffix参数的抓取与拼接,详细介绍了支付宝H5支付的底层机制。内容包括协议架构剖析、动态令牌生成与捕获、浏览器兼容性解决方案以及安全机制设计,为开发者提供全面的技术指南和实践建议。

weixin_27972919的博客 3525

多线程的学习

是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:由它自身的产生、存在和消亡的过程。线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc)是为了完成特定任务、用某种语言编写的一组指令的集合。进程可进一步细化为线程,是一个程序内部的一条执行路径。1.程序(program)2.进程(process)3.线程(thread)进程作为资源分配的单位。

weixin_49003858的博客 2318

电子取证之服务器取证思路

服务器取证是一个技术性很强的领域,涉及到多个环节,包括网站重构、网站代码分析、容器分析等。数据库密码的获取通常通过查看配置文件、日志文件、备份等途径,同时可以通过一些绕过技术如禁用身份验证来获取权限。对于不同的数据库,需要根据其特性采取相应的应对方法和命令。

2401_84830066的博客 2491

线程学习总结

1.线程和进程 1.1进程的概念 进程就是正在运行的程序,它会占用对应的内存区域,由CPU进行执行与计算。 1.2线程的概念 线程是操作系统OS能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位. 1.3多线程并发和并行 并发:两个或多个事件在同一时间间隔发生。 并行:两个或者多个事件在同一时刻发生。 并行是真正意义上,同一时刻做多件事情,而并发在同一时刻只会做一件事件,只是可以将时间切碎,交替做多件事情。 网上有个例子挺形...

qq_47499256的博客 443

Cocos Creator+微信小游戏:如何用wxDownloader实现资源动态加载与热更新

本文深入探讨了在Cocos Creator开发微信小游戏时,如何利用wxDownloader有效应对主包体积限制,实现资源的动态加载与热更新。文章详细介绍了从项目配置、资源标记到初始化加载的完整流程,并重点解析了基于MD5 Cache的缓存策略与版本控制方案,旨在帮助开发者构建稳健高效的资源管理体系,优化游戏启动速度与更新体验。

css33的专栏 825

射频工程师笔记---射频通信基础

回顾一下移动通信技术的发展,其实是互联网和通信技术的融合过程。在这个过程中,很多应用都在不断加入其中。比如计算机跟通信的融合产生了互联网、互联网跟手机的融合带来了移动互联网。手机可以看杂志、看视频、听音乐,于是又出现了内容服务产业;再后来,电视音箱等设备也能联网,于是网络跟家电又产生了融合。所以应用的出现总是在融合其他产业。在1995年,比尔·盖茨在《未来之路》一书中首次提出:在未来...

多年硬件从业经历,热爱学习,记录生活! 2万+

线程的学习

CPU难道真的很神通广大,能够同时执行那么多程序吗?不是的,CPU的执行是这样的:CPU的速度很快,一秒钟可以算好几亿次,因此CPU把自己的时间分成一个个小时间片,我这个时间片执行你一会,下一个时间片执行他一会,再下一个时间片又执行其他人一会,虽然有几十个线程,但一样可以在很短的时间内把他们通通都执行一遍,但对我们人来说,CPU的执行速度太快了,因此看起来就像是在同时执行一样,但实际上在一个时间点上,CPU只有一个线程在运行。 学习线程首先要理清楚三个概念: 进程:进程是一个静态的概念 线程:一个进

z184162946的博客 368

星座SAR动目标检测(GMTI)

参考代码 星座SAR动目标检测 www.youwenfan.com/contentcsg/52399.html。

feifeigo123的博客 550

多线程学习

多线程实现的通常用法1.继承线程或者实现Runnable接口2.重写run()方法3.创建一个主函数main函数,从中新建一个这个类的线程的实例化对象,通过创建多个实例化对象从而实现多线程。

weixin_47185398的博客 243

ffmpeg在windows的安装、合并、切片、.m4s、.m3u8处理

自己处理视频,我用的工具是 ffmpeg,因为涉及到.m3u8格式和.m4s格式的一些操作。ffmpeg的介绍我就不多说了,这里是它的官网地址: https://ffmpeg.org/ ,这里是文档: https://ffmpeg.org/documentation.html (看的头大,没咋看下去)...

一只爱吃糖的小羊 2689

Xilinx平台SRIO介绍(五)示例工程Example Design介绍

理解IP的使用,少不了Example Design的学习。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

学习多线程——必会的的9个方法

乱入: 定义一个线程可以继承Thread类,也可以实现Runnable接口,但是都需要重写run()方法,在run方法中的异常只能使用try...catch来进行捕获而不能是throw上抛异常。因为重写的run方法没有抛异常。 废话不多说,这篇文章里面主要介绍的是学习多线程的过程中必会的几个方法,在这里做个讲解,巩固一下知识点; 一、concurrentThread()——获取当前运行的线程...

༺࿈无关痛痒࿈༻的博客 420

Electron - Electron failed to install correctly, please delete node_modules/electron and try install

Electron安装失败:Electron failed to install correctly, please delete node_modules/electron and try installing again,electron安装报错:Electron failed to install correctly...解决方案,Electron 未能正确安装,请删除 node_modules/electron,然后再次尝试安装,如何解决这个问题,手把手教你解决,在yarn dev时报错,electr

🏆 前端领域优质创作者 4370

Python学习笔记(六):多线程、XML、JSON(快速入门篇)

以下是入门python看自强学堂的笔记,网址为http://www.ziqiangxuetang.com/python/python-tutorial.html多线程多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度

emmaalways的专栏 894

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

廖雪峰Python教程[完整版]

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

Java学习----day8——(2)多线程入门篇

针对于自己先前所接触的知识,谈一谈自己对于Thread线程的理解; 很常见的一个小项目,Socket套接字编程,我们想要做一个即时聊天室,每个用户对应每个线程,我们在未使用线程的情况下,只能将两个单独用户参加聊天。 (网上资料也是太多,还是自己总结吧) 一篇很靠谱的线程博客 以上思路有问题,看完多线程直接写个socket试试; (开始正文哈...

aizhulu5776的博客 101

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux 学习书目推荐

 网上看到的,做个标记。没研究过,仅供参考   linux编程学习 Linux 学习书目推荐 Linux基础 1、《Linux与Unix Shell 编程指南》 C语言基础 1、《C Primer Plus,5th Edition》【美】Stephen Prata著 2、《The  C Programming Language, 2nd E

以琛 的专栏 684

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

多线程编程 之 入门篇

自己第一次涉及c语言的多线程编程,实属入门了解级别的;之前只做过java的Runnable的多线程编程。本次我们可以把屏幕看成是一个资源,这个资源被两个线程所共用, /* #include #include using namespace std; DWORD WINAPI Fun(LPVOID lpParamter) { while(1) {

思緒凌亂 3482

Java多线程入门篇

当 CPU 从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。CPU 会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。1.2.3 拥有资源:进程是拥有资源的一个独立单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。因此,我们只要减少线程的数量,就能减少上下文切换的次数。

2401_86352791的博客 630

Python 多线程学习

前言 在爬虫学习的过程中,一旦爬取的数量过大,很容易带来效率问题,为了能够快速爬取我们想要的内容。为此我们可以使用多线程或者多进程来处理。 多线程和多进程是不一样的!一个是 threading 库,一个是 multiprocessing 库。而多线程 threading 在 Python 里面被称作鸡肋的存在!关于 Python 多线程有这样一句名言——“Python下多线程是鸡肋,推荐使用多进程...

Herishwater的博客 3715

Qt多线程编程(一)入门篇

啊啊啊

晴天的博客 2670

Python学习系列之多线程

多线程是指在一个进程中同时运行多个线程,每个线程可以执行不同的任务。相比于多进程,多线程共享进程的内存空间,适合处理需要频繁数据交互的场景。Python提供了thread和threading模块来支持多线程,其中threading是更推荐的高级模块,支持线程同步和通信功能。然而,Python的多线程受GIL锁限制,无法充分利用多核CPU,这一点在CPU密集型任务中表现尤为明显。

likuoelie的博客 723

java的多线程机制(入门篇)

多线程机制

qq_45384944的博客 375

【多线程入门篇】 创建线程以及线程的属性

讲述了线程的创建和线程的属性

fayifenjihuang的博客 859

gevent 入门篇

gevent.spawn()方法会创建一个协程实例,gevent.joinall()是使所有的线程执行完了之后在运行主线程,这跟多线程编程是同样的概念. 发现gevent比多线程也没快多少,那gevent究竟有什么优势.现在假设把上面的10替换成1000,也就是1000线程与1000个coroutine之间的比较,会出现什么结果呢?并发编程模型主要有: 多进程,多线程,事件驱动, 协程. gevent 是基于协程的异步框架,它需要依赖于greenlet.gevent有什么样的优势?

mohen_777的博客 537

Python 多线程编程全面学习指南

python多线程编程全面学习指南

尚墨1111的博客 1402

java学习之多线程篇学习总结

提到多线程,首先要学习一些概念性的词汇,线程和进程,并行和并发。一个正在系统上执行的程序为一个进程,一个进程包含多个线程。线程是操作系统能够进行运算调度的最小单位,多个线程会存在共享数据的情况。并行是实现多任务处理的方式。并行处理可以提高处理速度和效率,因为多个任务可以在同一时刻同时进行处理。在计算机领域,通常是通过多核处理器、GPU等技术来实现并行处理。并行处理的经典例子是在多核处理器上同时进行多个计算任务。多个程序或任务在同一时间段内同时执行的能力。

duehebfbf的博客 1280
上一篇: 分布式学习(三)——ACID原理与BASE理论
下一篇: 事务——扫盲篇
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值