iOS-佇列.執行緒.任務
現在先說兩個基本的概念,啥是程式,啥是執行緒,啥又是多執行緒;先把這兩個總是給弄清再講下面的
程式:正在進行的程式,我們就叫它程式.
現在先說兩個基本的概念,啥是程式,啥是執行緒,啥又是多執行緒;先把這兩個總是給弄清再講下面的
程式:正在進行的程式,我們就叫它程式.
多執行緒:多執行緒也就是說一個程式中有多條執行路徑.在iOS當中將一些比較耗時的操作放到另一條執行路徑裡.讓它與主執行緒同時執行.這樣不會造成主執行緒的堵塞.
扯完了這些那我們來看看什麼是任務,什麼是佇列!
任務分為同步任務與非同步任務,它們的區別是:
同步任務優先順序高,線上程中有執行順序,不會開啟新的執行緒。
非同步任務優先順序低,線上程中執行沒有順序,看cpu閒不閒。在主佇列中不會開啟新的執行緒,其他佇列會
開啟新的執行緒。
佇列:佇列我們可以把它理解為是管理任務的,它裡面放著很多的任務,來管理這些任務什麼時候在哪些執行緒
裡面執行.佇列是先進先出的
佇列分為序列佇列和並行佇列
序列佇列:佇列中的任務按順序執行(不會同時執行)並行佇列:佇列中的任務會併發執行,可能會有一個疑問,佇列不是先進先出嗎,如果後面的任務執行完了,怎麼出去的了。這裡需要強調下,任務執行完畢了,不一定出佇列。只有前面的任務執行完了,才會出佇列。
序列佇列開啟非同步任務,是有順序的
並行佇列裡開啟同步任務是有執行順序的,只有非同步才沒有順序
來侃侃在主佇列中開啟同步任務為什麼會阻塞執行緒?
在主佇列開啟同步任務,因為主佇列是序列佇列,裡面的執行緒是有順序的,先執行完一個執行緒才執行下一個執行緒,而主佇列始終就只有一個主執行緒,主執行緒是不會執行完畢的,因為他是無限迴圈的,除非關閉應用程式。因此在主執行緒開啟一個同步任務,同步任務會想搶佔執行的資源,而主執行緒任務一直在執行某些操作,不肯放手。兩個的優先順序都很高,最終導致死鎖,阻塞執行緒了
主執行緒佇列中不能開啟同步
主執行緒佇列中不能開啟同步,會阻塞主執行緒。只能開啟非同步任務,開啟非同步任務也不會開啟新的執行緒,只是降低非同步任務的優先順序,讓cpu空閒的時候才去呼叫。而同步任務,會搶佔主執行緒的資源,會造成死鎖。
為啥序列佇列開啟非同步任務後巢狀同步任務造成死鎖?(不作死就不會死)
因為序列佇列中執行緒是有執行順序的,需要等上面開啟的非同步任務執行完畢,才會執行下面開啟的同步任務。而上面的非同步任務還沒執行完,要到下面的大括號才算執行完畢,而下面的同步任務已經在搶佔資源了,就會發生死鎖。
序列佇列中開啟同步任務後巢狀同步任務造成死鎖(再套幾下,就不知道怎麼死的了)?
因為序列佇列中執行緒是有執行順序的,需要等上面開啟的同步任務執行完畢,才會執行下面開啟的同步任務。而上面的同步任務還沒執行完,要到下面的大括號才算執行完畢,而下面的同步任務已經在搶佔資源了,就會發生死鎖
序列佇列開啟同步任務後巢狀非同步任務就不會造成死鎖,開啟非同步,就會開啟一個新的執行緒,不會阻塞執行緒
主執行緒佇列和GCD建立的佇列也是有區別?
主執行緒佇列和GCD建立的佇列是不同的。在GCD中建立的佇列優先順序沒有主佇列高,所以在GCD中的序列佇列開啟同步任務裡面沒有巢狀任務是不會阻塞主執行緒,只有一種可能導致死鎖,就是序列佇列裡,巢狀開啟任務,有可能會導致死鎖。
相關文章
- 任務與佇列 iOS之多執行緒GCD(一)佇列iOS執行緒GC
- Java幾種執行緒池及任務佇列Java執行緒佇列
- Python多執行緒非同步任務佇列(例項)Python執行緒非同步佇列
- Python 30 行程式碼實現小型多執行緒任務佇列Python行程執行緒佇列
- 執行緒池監控2-監控執行緒池狀態、執行緒數量和佇列任務數量等執行緒佇列
- [原始碼分析] 分散式任務佇列 Celery 多執行緒模型 之 子程式原始碼分散式佇列執行緒模型
- 主佇列&主執行緒佇列執行緒
- iOS-多執行緒iOS執行緒
- java多執行緒:執行緒池原理、阻塞佇列Java執行緒佇列
- 詳解JavaScript的任務、微任務、佇列以及程式碼執行順序JavaScript佇列
- Celery任務佇列佇列
- 任務佇列,巨集任務與微任務佇列
- iOS 多執行緒--GCD 序列佇列、併發佇列以及同步執行、非同步執行iOS執行緒GC佇列非同步
- java執行緒池-工作佇列workQueueJava執行緒佇列
- 多執行緒學習-Disruptor佇列執行緒佇列
- 執行緒池與工作佇列(轉)執行緒佇列
- C# 執行緒與任務C#執行緒
- 一個執行定時任務(Crontab)和任務佇列(Taskqueue)的 Python 小工具佇列Python
- Python實現執行緒安全佇列Python執行緒佇列
- 執行緒池的阻塞佇列的理解執行緒佇列
- 列表與佇列——談談執行緒安全佇列執行緒
- java多執行緒:java佇列詳解Java執行緒佇列
- JavaConcurrentLinkedQueue佇列執行緒安全操作Java佇列執行緒
- Laravel 佇列重複執行同一個任務Laravel佇列
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- js定時任務佇列JS佇列
- iOS執行緒、同步非同步、序列並行佇列iOS執行緒非同步並行佇列
- 執行緒池中的最大執行緒數、核心執行緒數和佇列大小的合理設定執行緒佇列
- java-執行緒池佇列飽和策略Java執行緒佇列
- Java執行緒(篇外篇):阻塞佇列BlockingQueueJava執行緒佇列BloC
- Redis實現任務佇列、優先順序佇列Redis佇列
- OpenMP 中的執行緒任務排程執行緒
- 執行緒安全佇列(使用互斥鎖進行實現)執行緒佇列
- 死磕 java執行緒系列之執行緒池深入解析——普通任務執行流程Java執行緒
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- Spring 非同步執行緒池、排程任務執行緒池配置Spring非同步執行緒
- 事件迴圈與任務佇列事件佇列
- 如何寫一個任務佇列佇列