一個正在進行的應用程序 叫進程,一個進程 包括程序裏的所有資源
線程是進程的一部分.進程是給線程提供資源的
任何一個程序至少有一個線程,那個程序叫主線程
系統會爲線程分配 1兆的 棧空間
多線程是爲了執行 併發
線程: 執行任務(代碼)的單元
任務: 一個方法,代碼段
1.什麼是線程同步?
同步其實就是串行,線程2的執行依賴於線程1的結果.
2.如何實現同步:
建立一個NSOperationQueue,把它的線程最大值設爲1
(方法: setMaxConcurrentOperationCount)
NSThread 線程類 isMainThread它的類方法,用來判斷這個線程是不是主線程
凡前面是is的都是布爾值 ,打印的值是1(是組線程)或0
線程分兩種: 脫離線程 和 非脫離線程
脫離線程: 執行完任務之後,自動銷燬的線程
非脫離線程: 執行完任務之後,不會被銷燬的線程,可以後續執行別的任務
主線程 是 非脫離線程
每一個線程都自帶一個NSRunLoop對象,runloop默認是關閉的.一旦runloop開啓,你的線程就會成爲非脫離線程.runloop幫你輪詢有沒有新的任務分配到了這個線程裏面
實現多線程的方式一:
使用 跟類 NSObject 中的 performSelecterXXX方法.
UI的刷新一定要再主線程裏進行! 子線程刷新UI會異常,刷新不了,或者延遲刷新
多線程 背後執行 XX方法 .它解決了想立即執行的問題
如:[self performSelectorInBackground:@selector(aa) withObject:nil];
實現多線程的方式二(脫離線程):
使用 NSThread 類
二的第一個: 它解決了想立即執行的問題
創建一個線程, 並讓線程執行 self 的aa方法
[NSThread detachNewThreadSelector:@selector(aa) toTarget:self withObject:nil];
[thread start]; 記得寫開始執行(可以自己決定什麼時候開始執行)
二的第二個: 它解決了想延遲執行的問題 ,就是在方法中調延遲方法,然後最外層的方法再被外界使用
NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(aa) object:nil];
[thread start]; 記得寫開始執行(可以自己決定什麼時候開始執行)
第三種實現多線程的方式: NSOperationQueue 操作隊列 一個接口 調用的操作
NSInvocationOperation(程序調用操作) 是一個操作,在需要的時候開闢. 它是一個線程操作,爲的是使用它來調一個可用的方法.所以在需要用到的時候添加即可. 然後再把它添加到NSOperationQueue對象上
NSInvocationOperation *op1=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(aa) object:nil]; NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{ NSLog(@"這是一個block operation"); }]; //NSInvocationOperation 是一個操作,在需要的時候,開闢 NSOperationQueue *queue=[[NSOperationQueue alloc] init]; [queue setMaxConcurrentOperationCount:1];//線程最大數
[queue addOperation:op1]; //一旦把她加到NSOperationQueue時,需要start 即: [op1 start]
但現在只需要把操作放到隊列裏即可,不需要人爲調用start,queue會根據op的排隊情況,幫你調用start.會智能爲op安排線程 [queue addOperation:op2];
第四種 實現多線程的方法是GCD
如果一個任務(方法)在子線程裏面執行,我們需要在任務裏面加自動釋放池
原因: 因爲,線程與線程之間 相互獨立的.但是資源是共享的,共享 堆空間.如果子線程裏開闢了空間,沒有釋放.其他線程也無法使用這塊以及開闢的空間.
尤其是當子線程裏大量使用便利構造器的時候,會導致很多堆空間無法回收內存
所有的autorelease只有遇到自動釋放池的時候纔會釋放,所以任何子線程都要加自動釋放池
線程 共享堆.棧不共享! 每個子線程默認的棧大小是512K.主線程棧大小是1M.棧主要是放 局部變量的,局部變量出了方法就會銷燬,因此,儘管只有512K或者1M但是以及夠用了.棧空間的大小 必須是4k的整數倍.
執行完子線程以後一定要回到主線程 ( 回到主線程 子線程通信)
方法:performSelectorOnMainThread: withObject: waitUntilDone:]; //waitUntilDone 等待結束 可以控制執行順序
如下: 在
@autoreleasepool { 如果在子線程裏面需要執行任務,一定要寫到自動釋放池裏面 NSLog(@"+++%d",[NSThread isMainThread]); for (int i = 0; i < 1000; i++) { NSLog(@"%d",i); } //回到主線程 子線程通信.執行完子線程以後一定要回到主線程 [self performSelectorOnMainThread:@selector(bb) withObject:nil waitUntilDone:YES]; //waitUntilDone 等待結束 可以控制執行順序 NSLog(@"子線程結束了"); } }
多線程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
java性能優化筆記(二)設計優化
kid2412
2019-02-24 13:34:37
java多線程之Semaphore信號量詳解
ketqi
2019-02-23 13:33:26
Java多線程之ExecutorService
myfuxing
2019-02-23 13:14:09
java多線程之fork/join框架詳解
ketqi
2019-02-23 12:57:20
java多線程之CountDownLatch倒數閘門
ketqi
2019-02-23 12:57:05
mysql事務(2)
冷暖己知
2019-02-23 00:29:41
優雅的讓一個類在線程安全和線程非安全間切換
一見_
2019-02-23 00:16:35
MFC多線程編程注意事項
奇妙的hi
2019-02-23 00:14:43
黑馬程序員--Java基礎學習筆記【序列化、多線程】
zh_lianxin
2019-02-23 00:09:27
ActionContext和ServletActionContext
阿呆jeans
2019-02-23 00:05:45