多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > IOS 多線程原理

IOS 多線程原理

來源:程序員人生   發布時間:2015-04-13 08:15:42 閱讀次數:3451次

iPhone中的線程利用其實不是無控制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第2個線程開始都是512KB。并且該值不能通過編譯器開關或線程API函數來更改。只有主線程有直接修改UI的能力。

1.線程概述

有些程序是1條直線,出發點到終點;有些程序是1個圓,不斷循環,直到將它切斷。直線的如簡單的Hello World,運行打印完,它的生命周期便結束了,像曇花1現那樣;圓如操作系統,1直運行直到你關機。 
1個運行著的程序就是1個進程或叫做1個任務,1個進程最少包括1個線程,線程就是程序的履行流。Mac和iOS中的程序啟動,創建好1個進程的同時, 1個線程便開始運行,這個線程叫主線程。主線程在程序中的地位和其他線程不同,它是其他線程終究的父線程,且所有界面的顯示操作即AppKit或 UIKit的操作必須在主線程進行。 
系統中的每個進程都有自己獨立的虛擬內存空間,而同1個進程中的多個線程則共用進程的內存空間。每創建1個新的線程,都需要1些內存(如每一個線程有自己的Stack空間)和消耗1定的CPU時間。另外當多個線程對同1個資源出現爭取的時候需要注意線程安全問題。

 

2.創建線程

創建1個新的線程就是給進程增加了1個履行流,履行流總得有要履行的代碼吧,所以新建1個線程需要提供1個函數或方法作為線程的入口。

1.使用NSThread

NSThread提供了創建線程的途徑,還可以提供了檢測當前線程是不是是主線程的方法。 使用NSThread創建1個新的線程有兩種方式:

  • 1.創建1個NSThread的對象,調用其start方法。對這類方式的NSThread對象的創建,可使用1個目標對象的方法初始化1個NSThread對象,或創建1個繼承NSThread類的子類,實現其main方法,然后在直接創建這個子類的對象。
  • 2.使用 detachNewThreadSelector:toTarget:withObject:這個類方法創建1個線程,這個比較直接了,直接使用目標對象的方法作為線程啟動入口。

2.使用NSObject

其實NSObject直接就加入了多線程的支持,允許對象的某個方法在后臺運行。如:

  1. [myObj performSelectorInBackground:@selector(doSomething) withObject:nil]; 

3.POSIX Thread

由于Mac和iOS都是基于Darwin系統,Darwin系統的XUN內核,是基于Mach和BSD的,繼承了BSD的POSIX接口,所以可以直接使用POSIX線程的相干接口來使用線程。

創建線程的接口為 pthread_create,固然在創建之前可以通過相干函數設置好線程的屬性。以下為POSIX線程使用簡單的例子。

  1. // //  main.c //  pthread // //  Created by Lu Kejin on 1/27/12. //  Copyright (c) 2012 Taobao.com. Al 

 

3.多線程進階

NSOperation&NSOperationQueue

很多時候我們使用多線程,需要控制線程的并發數,畢竟線程也是消耗系統資源的,當程序中同時運行的線程過量時,系統必定變慢。 所以很多時候我們會控制同時運行線程的數目。

NSOperation可以封裝我們的操作,然后將創建好的NSOperation對象放到NSOperationQueue中,OperationQueue便開始啟動新的線程去履行隊列中的操作,OperationQueue的并發度是可以通過以下方式進行設置:

  1. - (void)setMaxConcurrentOperationCount:(NSInteger)count 

GCD

GCD是Grand Central Dispatch的縮寫,是1系列的BSD層面的接口,在Mac 10.6 和iOS4.0以后才引入的,且現在NSOperation和NSOperationQueue的多線程的實現就是基于GCD的。目前這個特性也被移植到 FreeBSD上了,可以查看libdispatch這個開源項目。

比如1個在UIImageView中顯示1個比較大的圖片

  1. dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(imageDownloa 

固然,GCD除處理多線程外還有很多非常好的功能,其建立在強大的kqueue之上,效力也能夠得到保障。

 

4.線程間通訊

線程間通訊和進程間通訊從本質上講是相似的。線程間通訊就是在進程內的兩個履行流之間進行數據的傳遞,就像兩條并行的河流之間挖出了1道單向活動長溝,使得1條河流中的水可以流入另外一條河流,物資得到了傳遞。

1.performSelect On The Thread 

框架為我們提供了強迫在某個線程中履行方法的途徑,如果兩個非主線程的線程需要相互間通訊,可以先將自己確當前線程對象注冊到某個全局的對象中去,這樣相 互之間就能夠獲得對方的線程對象,然后就能夠使用下面的方法進行線程間的通訊了,由于主線程比較特殊,所以框架直接提供了在出線程履行的方法。

  1. @interface NSObject (NSThreadPerformAdditions) - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUnti 

       2.Mach Port 
在蘋果的Thread Programming Guide的Run Pool1節的Configuring a Port-Based Input Source 這1段中就有使用Mach Port進行線程間通訊的例子。 其實質就是父線程創建1個NSMachPort對象,在創建子線程的時候以參數的方式將其傳遞給子線程,這模樣線程中就能夠向這個傳過來的 NSMachPort對象發送消息,如果想讓父線程也能夠向子線程發消息的話,那末子線程可以先向父線程發個特殊的消息,傳過來的是自己創建的另外一個 NSMachPort對象,這樣父線程便持有了子線程創建的port對象了,可以向這個子線程的port對象發送消息了。

固然各自的port對象需要設置delegate和schdule到自己所在線程的RunLoop中,這樣來了消息以后,處理port消息的delegate方法會被調用,你就能夠自己處理消息了。

 

5.RunLoop

RunLoop從字面上看是運行循環的意思,這1點也不錯,它確切就是1個循環的概念,或準確的說是線程中的循環。 本文1開始就提到有些程序是1個圈,這個圈本質上就是這里的所謂的RunLoop,就是1個循環,只是這個循環里加入很多特性。 
首先循環體的開始需要檢測是不是有需要處理的事件,如果有則去處理,如果沒有則進入眠眠以節省CPU時間。 所以重點便是這個需要處理的事件,在RunLoop中,需要處理的事件分兩類,1種是輸入源,1種是定時器,定時器好理解就是那些需要定時履行的操作,輸 入源分3類:performSelector源,基于端口(Mach port)的源,和自定義的源。編程的時候可以添加自己的源。RunLoop還有1個視察者Observer的概念,可以往RunLoop中加入自己的 視察者以便監控著RunLoop的運行進程,CFRunLoop.h中定義了所有視察者的類型:

  1. enum CFRunLoopActivity { kCFRunLoopEntry = (1 << 0), kCFRunLoopBeforeTimers = (1 << 1), kCFRunLoopBeforeSources = ( 

如果你使用過select系統調用寫進程序你即可以快速的理解runloop事件源的概念,本質上講事件源的機制和select1樣是1種多路復用IO的 實現,在1個線程中我們需要做的事情其實不單1,如需要處理定時鐘事件,需要處理用戶的觸控事件,需要接受網絡遠端發過來的數據,將這些需要做的事情統統注 冊到事件源中,每次循環的開始便去檢查這些事件源是不是有需要處理的數據,有的話則去處理。 拿具體的利用舉個例子,NSURLConnection網絡數據要求,默許是異步的方式,其實現原理就是創建以后將其作為事件源加入到當前的 RunLoop,而等待網絡響應和網絡數據接受的進程則在1個新創建的獨立的線程中完成,當這個線程處理到某個階段的時候比如得到對方的響應或接受完 了網絡數據以后便通知之前的線程去履行其相干的delegate方法。所以在Cocoa中常常看到scheduleInRunLoop:forMode: 這樣的方法,這個便是將其加入到事件源中,當檢測到某個事件產生的時候,相干的delegate方法便被調用。對CoreFoundation這1層而 言,通常的模式是創建輸入源,然后將輸入源通過CFRunLoopAddSource函數加入到RunLoop中,相干事件產生后,相干的回調函數會被調 用。如CFSocket的使用。 另外RunLoop中還有1個運行模式的概念,每個運行循環必定運行在某個模式下,而模式的存在是為了過濾事件源和視察者的,只有那些和當前 RunLoop運行模式1致的事件源和視察者才會被激活。

每個線程都有其對應的RunLoop,但是默許非主線程的RunLoop是沒有運行的,需要為RunLoop添加最少1個事件源,然后去run它。1般情況下我們是沒有必要去啟用線程的RunLoop的,除非你在1個單獨的線程中需要久長的檢測某個事件。


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 不卡欧美 | 午夜免费啪在线观看视频网站 | 国产美女视频爽爽爽 | 国产中日韩一区二区三区 | 叼嘿免费 | 99久久精品毛片免费播放 | 综合 欧美 小说 另类 图 | 亚洲无限乱码一二三四区 | 老司机免费午夜精品视频 | 图片区小说校园综合 | 日本www在线观看 | 日日摸人人看97人人澡 | 91国内精品久久久久免费影院 | 欧美综合在线观看 | 欧美尤物视频 | 最近中文字幕大全高清视频 | 国产97色在线 | 亚洲 | poronovideos德国极品 | 美国一级特a黄 | 国产一区二区在线视频观看 | 亚洲一区影院 | 欧美性猛交xxxx免费看 | 国产成人亚洲精品无广告 | 亚洲成人黄色 | 国内精品免费视频精选在线观看 | 日本欧美做爰全免费的视频 | 91九色最新地址 | 免费网站www网站免费 | 亚洲欧美日本综合 | 午夜亚洲精品久久久久久 | 视频一区视频二区在线观看 | 2021久久精品永久免费 | 爱爱视频免费 | 亚洲国产成人精彩精品 | 黄色大片aa | 中文字幕在线看片 | 91久久精一区二区三区大全 | 有毛片毛毛片毛片毛片 | 欧美日韩另类综合 | 亚洲视频精品在线 | 欧美性xxxx禁忌 |