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.pswp.cn/news/255706.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255706.shtml
英文地址,請注明出處:http://en.pswp.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 …