簡體   English   中英

線程池:DispatchQueue.main.async

[英]Thread Pool: DispatchQueue.main.async

我從事過Java工作,並且對線程和線程池的工作非常清楚。

我想知道是否有人能解釋如何創建線程的工作並在swift的線程池中分配空間?

還有

Dispatch.main.async {
 // some code
}

創建新線程還是異步執行任務?

在此先感謝=)

隊列和線程是不同的概念。 隊列是有序的(有時是優先級的)塊序列來執行的。 作為(大多數)實現細節,必須將塊調度到線程上才能執行,但這不是它們的主要觀點。

因此, Dispatch.main.async將一個塊分派(附加)到主隊列。 主隊列是串行的,有些特殊,因為它承諾也只在主線程上運行(如Paulw11所述)。 它還承諾與主要的runloop相關聯。 理解這個“將一個塊附加到隊列”概念是至關重要的,因為它對您在隊列中設計事物的方式與在線程中設計事物的方式有重大影響。 async並不意味着“現在開始運行它”。 這意味着“堅持在隊列中,但不要等待它。”

由於的設計是如何可以是不同的一個很好的例子,把東西上的隊列,並不意味着它永遠不會運行(即使沒有錯誤或死鎖)。 暫停隊列以使其停止調度塊是可能且有用的。 可以將隊列綁定到其他隊列,以便當隊列“調度”某些內容時,它只是將其放入另一個隊列而不是執行它。 對於與“在后台運行的東西”無關的隊列,你可以做很多事情。 您可以將完成處理程序附加到塊。 您可以使用組等待塊集合。 GCD是一種思考並發性的方法。 並行性只是一個附帶的好處。 (對這個概念的一個很好的討論是並發不是Rob Pike的並行性 。它在Go中,但這些概念仍然適用。)

如果在主隊列上運行時調用Dispatch.main.async ,那么在當前塊完成之前,該塊絕對肯定不會執行。 在UIKit和AppKit中,“當前塊完成”通常意味着“您從操作系統調用的方法返回”。 雖然沒有以這種方式實現,但您可以假裝每次從操作系統調用時,它都包含在對Dispatch.main.async的調用中。

這也是您必須永遠不要從主隊列調用Dispatch.main.sync (note sync )的原因。 該塊將等待您返回,並且您將等到塊完成。 經典的僵局。

通常,線程池不是您在iOS中的業務。 這是一個實現細節。 有時候出於性能原因需要考慮它,但如果你在考慮它太多,你可能會錯誤地設計你的並發性。

如果您來自Java,那么您肯定希望閱讀“並發編程指南”中的“從線程遷移 ”。 它是如何重新思考隊列中基於線程的模式的權威資源。

在執行代碼之前,您的代碼會對主隊列( Dispatch.main )上的代碼塊進行排隊,並立即返回( .async )。

您無法控制隊列使用哪個線程。 即使您創建自己的隊列:

let serialQueue = DispatchQueue(label: "queuename")
serialQueue.async { 
    ...
} 

你不知道你的代碼將在哪個線程上運行。


更新:

正如Paulw11在評論中正確指出的那樣,

...如果在主隊列上調度任務,則保證在主線程上執行。 如果在任何其他隊列上調度任務,則不知道它將在哪個線程上執行; 它可以在主線程或其他線程上執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM