4.0 多线程基础篇

 

本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末

 

如果觉得本文内容过长,请前往本人 “简书

 

 

4.0-1.1 进程

  • 概念 : 进程是指在系统中正在运行的一个应用程序 (操作系统中每一个 APP 就是一个进程)  
  • 性质 : 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内

    进程为应用程序开辟独立的内存空间;(这块内存空间是独立的,受保护的!进程和进程之间是互不干扰的!)

  • 举例 : 比如同时打开QQ、Xcode,系统就会分别启动2个进程
  • 查看进程 : 通过“活动监视器”可以查看Mac系统中所开启的进程
  • 所有的 UI 操作和 UI 事件都是进程

 

4.0-1.2 线程
  • 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
  • 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行( 线程执行进程/应用程序中的代码)
举例 : 比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行
  • 主线程:在一个应用程序启动之后,会默认开启一条线程
  • 子线程:主线程之外的线程(手动开启的)
单个线程 - 串行:
概念 : 1个线程中任务的执行是串行的(在线程中的代码是按顺序执行的!同一时间内,只能有一个代码块执行!)
解析 : 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
也就是说,在同一时间内,1个线程只能执行1个任务
举例 : 比如在1个线程中下载3个文件(分别是文件A、文件B、文件C), 只能一个一个的下载
总结 : 因此,也可以认为线程是进程中的1条执行路径
问题:为什么开启一条新线程之后就能解决卡住主线程这个问题了呢?
答: 因为线程和线程之间是并发执行(同时执行)!
多个线程 - 并行:多线程
概念 : 1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务
优点 : 多线程技术可以提高程序的执行效率
举例 : 比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C), 则分别同时下载
4.0-1.3 【区别】进程 & 线程
进程是由许多条线程组成,一个进程可以包含很多条线程,每条线程都可以执行不同的代码!
进程与线程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
4.0-2.1 多线程原理
多线程原理:(为什么多条线程之间可以并发(同时)执行呢?)
本质 : 同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
原理 : 如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
思考:如果线程非常非常多,会发生什么情况?
答案 :
如果线程非常多,会在多条线程之间来回切换,消耗大量的 CPU 资源
  • 每个线程被调度的次数会降低
  • 线程的执行效率会下降
CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
每条线程被调度执行的频次会降低(线程的执行效率降低)

iOS 8.0 主线程的默认堆栈大小也是 512K

4.0-2.2 多线程优缺点
多线程的优点 :
(1) 能适当提高程序的执行效率:
  •  并发执行(同时执行): 线程和线程之间是同时执行的!(不同的线程中,任务同时执行)  
(2) 能适当提高资源利用率(CPU、内存利用率)
多线程的缺点 : (既然多线程这么爽, 线程是不是越多越好呢?)
(1) 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB的栈区空间),如果开启大量的线程,会占用大量的内存空间,降低程序的性能
(2) 线程开启越多,CPU 就需要在多条线程之间来回切换,CPU在调度线程上的开销就越大,CPU就越累!
(3) 开启线程会提高代码的复杂性(会使应用程序增加很多代码!代码变多之后,程序复杂性就会提高!)
程序设计更加复杂:比如线程之间的通信、多线程的数据共享
建议: 在移动应用的开发中; 一般只开3~5条线程!
4.0-2.3 多线程在iOS开发中的应用
主线程 / UI线程:
概念 : 一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程” (程序启动创建的线程)
作用 : 
  • 显示 / 刷新UI界面
  • 处理UI事件(比如点击事件、滚动事件、拖拽事件等)
使用注意 : 
  • 别将比较耗时的操作放到主线程中
  • 要将耗时操作放在后台线程执行,否则会影响 UI 的流畅度,给用户一种'卡顿'的坏体验,破坏用户体验
  • 所有网络访问都是耗时操作!
解决方案 :
  • 将耗时操作放在子线程(后台线程、非主线程)
  • 那样就不会阻塞我们的主线程 , 一般开 3 ~ 6 条线程  
好处 :
  • 在用户点击按钮那一刻就有反应
  • 能同时处理耗时操作和用UI控件的事件
4.0-2.4 iOS中多线程的实现方案

如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^
 
作者:蓝田(Loto)
出处:http://www.cnblogs.com/shorfng/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
 

如有疑问,请发送邮件至 shorfng@126.com 联系我。
 
 

转载于:https://www.cnblogs.com/shorfng/p/5315593.html

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

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

相关文章

【python pandas excel操作】

目录 1、打开Excel,获取不同sheet的名称 2、获取不同sheet的内容 3、 获取行数以及表头 4、对某一列的信息进行筛选 5、根据列号和索引号提取一行或者一列的数据 6、其他panda对Excel的操作 摘自:python对excel操作获取某一列,某一行的值…

线性期望(BUPT2015校赛.F)

将整体期望分成部分期望来做。 F. network 时间限制 3000 ms 内存限制 65536 KB题目描述 A social network is a social structure made up of a set of social actors (such as individuals or organizations) and a set of the relationships between these actors. In simp…

【pyqt5学习】——进度条progressBar

# 进度条 self.progressBar.setValue(0) # 设置进度条的最小值 self.progressBar.setMaximum(100) # 设置进度条的最大值 # 设置进度条当前值 self.progressBar.setValue((int(curindex/excelNum)*100)) 常用方法 方法值说明setRangeQProgressBar.setRange(min, Max)通过 setR…

弧焊 不同气体对焊缝的影响 100二氧化碳 15%氩气CO2混合

Ar含量提高后,相比原来的100%CO2成本会提高很多。 Ar的密度比CO2小,焊接的焊枪必须压的很低,如果焊接结构中有一些狭小区域,焊枪则无法到达。纯CO2气体保护焊,焊丝可伸出较长。 Ar属于惰性气体,焊接时…

Windows和Linux如何使用Java代码实现关闭进程

在用selenium做自动化测试时,由于各种不明原因,有时Chrome浏览器会出现假死的情况,也就是整个浏览器响应超时,本人脚本主要部署在Windows机器上,所以主要以Windows为主,浏览器为Chrome,即如下图所示 或者由…

【pyqt5学习】——下拉框comboBox

# 向下拉框中添加选型,具体为在下拉框第index1个选型设置为内容name self.comboBox.addItem(name,index1) # 将下拉框中所有的选项删除 self.comboBox.clear() # 根据索引获取当前的下拉框内容 index self.comboBox.currentIndex() text self.comboBox.itemText(i…

【文件处理】——Python pandas 写入数据到excel中

目录 1、创建一个新的excel表格 2、 获取写入excel的数据data 3、将data类型转换为pandas接受的类型 4、写入到excel中 5、保存excel 最终结果 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/11/9 23:18 # Author : linlianqin # Site : # File …

微软Visual Studio 2012软件功能介绍

对于从事.net程序开发的我们,都要用到C#依附的Visual Studio平台!Visual Studio是目前最流行的Windows平台应用程序开发环境。最新版本为 Visual Studio 2012 版本,基于 NET Framework4.5 。. Visual Studio 2012内置的测试工具可以帮助开发者打造高质量…

Spring Boot轻松理解动态注入,删除bean

2019独角兽企业重金招聘Python工程师标准>>> 我们通过getBean来获得对象,但这些对象都是事先定义好的,我们有时候要在程序中动态的加入对象.因为如果采用配置文件或者注解,我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bea…

对象的深度克隆

最近在复习javascript,然而我的读书笔记,以及技术博客,已经转战cmd Markdown。所以这里就只写了一个对象的深度克隆方法: 这个克隆方法可以让我很深刻的了解到了js中,万物皆对象,对js有更深入的了解。转载于…

C/C++语言变量声明内存分配

[cpp] view plaincopy<span style"font-family: Verdana, Arial, Helvetica, sans-serif; ">一个由c/C编译的程序占用的内存分为以下几个部分</span> 1、栈区&#xff08;stack&#xff09;— 程序运行时由编译器自动分配&#xff0c;存放函数的参数值…

【pyqt5学习】——items view相关控件(list view、table view)

目录 list view——列表视图 table view——表格视图 list view——列表视图 PyQt5-高级控件使用&#xff08;QListView&#xff09; - ygzhaof_100 - 博客园QListView用于展示数据&#xff0c;子类是QListWidget。QlistView基于模型Mode&#xff0c;需要程序创建Model然后保…

【pyqt5学习】——containers相关控件(tab widget、scroll area、stack widget、tool box、MDI area、dock widget)

目录 1、tab widget 2、scroll area 2.1 使用方法 Step1.拖入QScrollArea ​Step2.改变widget控件布局 ​Step3.设置scrollAreaWidgetContents大小 3、Tool Box 4、Stacked Widget 4.1 案例展示 5、frame 6、MDI AREA 7、dock widget 7.1 悬浮状态 7.2 吸附状态 conta…

Java使用原子类进行多线程的 i++ 操作示例

2019独角兽企业重金招聘Python工程师标准>>> 使用AtomicInteger原子类进行 i 操作 可以有类似 synchronized 实现同步的效果。 原子操作是不能分割的整体&#xff0c;没有其他线程能够中断或检查正在原子操作中的变量。一个原子类型就是一个原子操作可用的类型&…

mybatis实战教程(mybatis in action)之二:以接口的方式编程

前面一章&#xff0c;已经搭建好了eclipse,mybatis,mysql的环境&#xff0c;并且实现了一个简单的查询。请注意&#xff0c;这种方式是用SqlSession实例来直接执行已映射的SQL语句&#xff1a;session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID&…

Linux内核分析06

进程的描述和进程的创建 一&#xff0c;进程的描述 进程控制块PCB——task_struct &#xff08;进程描述符&#xff09;&#xff0c;为了管理进程&#xff0c;内核必须对每个进程进行清晰的描述&#xff0c;进程描述符提供了内核所需了解的进程信息。 struct task_struct数据结…

【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写

目录 一、说明 二、安装pyqt5以及相关工具&#xff08;pyqt5、pyuic、pqrcc&#xff09; 三、创建.ui文件 1、选中文件右键-external-pyqt5 打开GUI设计界面 2、创建一个界面&#xff08;内含四个等大label框&#xff09; 3、CTRLS保存 4、找到ui文件&#xff0c;右键--e…

C#学习笔记——25个经典问题

1.静态成员和非静态成员的区别&#xff1f; 2.const 和 static readonly 区别&#xff1f; 3.extern 是什么意思&#xff1f; 4.abstract 是什么意思&#xff1f; 5.internal 修饰符起什么作用&#xff1f; 6.sealed 修饰符是干什么的&#xff1f; 7.override 和 o…

PHP的学习--RSA加密解密

PHP服务端与客户端交互或者提供开放API时&#xff0c;通常需要对敏感的数据进行加密&#xff0c;这时候rsa非对称加密就能派上用处了。 举个通俗易懂的例子&#xff0c;假设我们再登录一个网站&#xff0c;发送账号和密码&#xff0c;请求被拦截了。 密码没加密&#xff0c;那攻…