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操作获取某一列,某一行的值…

焊接机器人应用现状及发展趋势

据不完全统计,全世界在役的工业机器人中大约有将近一半的工业机器人用于各种形式的焊接加工领域,焊接机器人应用中最普遍的主要有两种方式,即点焊和电弧焊。图4所示是这两种焊接机器人在工业机器人中所占的大致比例。我们所说的焊接机器人其实…

线性期望(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,即如下图所示 或者由…

CSS之A标签

a标签&#xff0c;超级链接 a是英语anchor锚的意思。 a标签常用的就是三个属性&#xff1a; 1 <a href"网址" title"悬停文本" target"_blank">超级链接文字</a> 页面内的锚点&#xff0c;用name属性或者id属性 1 …

【pyqt5学习】——下拉框comboBox

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

安装scapy遇到的问题

1. Mac平台 在mac上安装scapy可以说是困难重重&#xff0c;一来因为scapy实在有些小众和老旧&#xff0c;再加上安装说明文档都是python2.5 也没有详细说明一些安装问题。 折腾了大概三个小时之后终于解决了这个老大难。 注&#xff1a;我的环境为anaconda2.3 - python2.7.10 一…

DAY5-小别-2018-1-15

有两天没有写了&#xff0c;前天考完试出去浪了&#xff0c;惭愧自己没有学习&#xff1b;昨天&#xff0c;启程回家看完了循环内容的视频&#xff0c;晚上十点半火车到站&#xff0c;没抽出时间写了&#xff0c;还看了《黑客帝国》&#xff0c;有点小感触&#xff0c;人工智能…

【文件处理】——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 …

centerOS安装chkrootkit

Chkrootkit是一个在本地系统检查rootkit痕迹的工具&#xff0c;它是检查系统二进制文件是否被rootkit病毒修改的一个shell脚本。 &#xff08;1&#xff09;centerOS安装chkrootkit 安装gcc编译环境yum install gcc gcc-c make -y 安装chkrootkit.tar.gz 解压后执行 #make sens…

微软Visual Studio 2012软件功能介绍

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

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

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

对象的深度克隆

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

【pyqt5学习】——TextEdit属性,将滑条始终置于最后

法一&#xff1a; # 向文本框中添加字符串&#xff0c;自动换行&#xff0c;不会覆盖之前的内容 self.textEdit.append(datetime.datetime.strftime(datetime.datetime.now(),"%Y-%m-%D %H:%M:%S")" 共%d个文件&#xff0c;剩余%d个文件,耗时%.5f&#xff08;…

VS2012 中 c++项目中的各个选项介绍

MFC(Microsoft Foundation Classes)&#xff0c;是一个微软公司提供的类库&#xff08;class libraries&#xff09;&#xff0c;以C类的形式封装了Windows的API&#xff0c;并且包含一个应用程序框架&#xff0c;以减少应用程序开发人员的工作量。其中包含的类包含大量Windows…

Java基于springMVC的验证码案例

1 2 Java验证码案例&#xff08;基于springMVC方式&#xff09;3 4 验证码工具类5 package com.ekyb.common.util;6 7 import java.awt.Color;8 import java.awt.Font;9 import java.awt.Graphics;10 11 import java.awt.image.BufferedImage;12 import java.util.ArrayList;13…

eval函数的工作原理

eval函数的工作原理 eval函数会评估一个给定的含有JavaScript代码的字符串&#xff0c;并且试图去执行包含在字符串里的表达式或者一系列的合法的JavaScript语句。eval函数将把最后一个表达式或者语句所包含的值或引用作为返回值。 举例说明 eval评估JavaScript表达式var bar …