建立子執行緒的幾種方式
①第一種方式 : 使用執行緒類 nsthread
[nsthread detachnewthreadselector:@selector(task1) totarget:self withobject:nil];
②第二種方式 : 使用執行緒類, 需要手動開啟子執行緒
nsthread *thread = [[nsthread alloc] initwithtarget:self selector:@selector(task1) object:nil];
//開啟執行緒
[thread start];
//釋放
[thread release];
③第三種方式 : 使用 nsobject 提供的方法
[self
performselectorinbackground:
@selector(task1) withobject:
nil];
④第四種方式 : 使用任務佇列
//任務建立形式一 :
nsinvocationoperation *op1 = [[nsinvocationoperation alloc] initwithtarget:self
selector:@selector(task1) object:nil];
nsinvocationoperation *op1 = [[nsinvocationoperation alloc] initwithtarget:self
selector:@selector(task2) object:nil];
//任務建立形式二 :
nsblockoperation *op1 = [nsblockoperation blockoperationwithblock:^
}];nsblockoperation *op2 = [nsblockoperation blockoperationwithblock:^
}];
//建立任務佇列, 將任務新增到任務佇列, 任務佇列會為佇列中的每乙個任務合理安排子執行緒來完成
nsoperationqueue *
queue=[
[nsoperationqueue alloc]
init];
//將任務新增到佇列
[queue addoperation:op1];
[queue addoperation:op2];
//釋放
[op1 release];
[op2 release];
[queue release];
2 . 執行緒的同步和併發
執行緒同步: 任務與任務之間有先後關係, 後乙個任務的執行必須等待前一任務的結束.執行緒併發: 任務與任務之間沒有先後順序, 先執行的任務的執行緒,有可能最後乙個完成.
//在第四種建立子執行緒的方法基礎上
//1. 實現執行緒同步的第一種方式: 設定最大併發數,在新增到佇列之前設定
[queue setmaxconcurrentoperationcount:1];
//2. 實現執行緒同步的第二種方式: 新增依賴關係
[op2 adddependency:op1];
3 . 定時器
在主線程中建立定時器,讓它完成每5秒輸出一次資訊的任務, 可以看到在控制台不斷地輸出資訊, 而在子執行緒中, 設定定時器, 完成同樣的任務, 卻無法輸出相同的結果.可以發現: 系統預設在主線程中開啟事件迴圈, 不斷監聽使用者的互動事件, 但在子執行緒中沒有開啟 事件迴圈(runloop)
子執行緒中要做以下操作
[nstimer scheduledtimerwithtimeinterval:0.5 target:self selector:@selector(task3) userinfo:nil repeats:yes];
//在子執行緒中開啟事件迴圈, 正是有了事件迴圈, 定時器才能夠重複的執行任務
[[nsrunloop currentrunloop] run];//開啟事件迴圈一定要在建立定時器之後
4 . 自動釋放池
在子執行緒的任務中是沒有自動釋放池的, (便利構造器方法建立的物件要有自動釋放池才能釋放). 加上自動釋放池@ autoreleasepool {}
5 . 主線程和子執行緒之間的切換
主線程跳轉到子執行緒執行任務: 直接建立子執行緒, 執行對應的任務即可.子執行緒跳轉到主線程執行任務: 對於重新整理介面的操作交由主線程處理, 使用[self performselectoronmainthread:@selector(refreashui:) withobject:image waituntildone:yes];方法來操作
[self performselectoronmainthread:@selector(refreashui:) withobject:image waituntildone:yes];//waituntildone 是否等到完成, 如果多個引數, 可以將多個引數放入容器(字典, 陣列)中, withobject 時填寫該容器即可.6 . 事務鎖(以賣票為例)
執行緒互斥: 當多個執行緒同時訪問同一資源時, 乙個執行緒訪問時, 其他執行緒應該等待, 此時應該加鎖.
//1. 在類中建立鎖屬性@property (nonatomic, retain) nslock *lock;// 不要忘記釋放
//2. 在方法中初始化鎖
self.lock = [[[nslock alloc] init] autorelease];
//3. 建立兩個子執行緒處理同乙個任務
[nsthread detachnewthreadselector:@selector(selltickets:) totarget:self withobject:@"張三"];
[nsthread detachnewthreadselector:@selector(selltickets:) totarget:self withobject:@"李四"];
//4. 在任務方法中操作鎖
//(1). 加鎖
[self.lock lock];
//(2). 解鎖
[self.lock unlock];
多執行緒的使用
using system using system.threading namespace 15.1thread 正在執行測試方法 thread.currentthread.name static void main string args 乙個可能的情況,因為多執行緒是並行的,不能確定每一次具體的...
多執行緒的使用
package cm.aichijihua public class threadtest1 catch interruptedexception e system.out.println thread.currentthread getname system.out.println this.ge...
多執行緒的使用
執行緒同步的機制包括 互斥鎖,讀寫鎖,自旋鎖,條件變數,訊號量,非同步訊號 讀寫鎖 讀寫鎖與互斥量類似,不過讀寫鎖允許更高的並行性。適用於讀的次數大於寫的次數的資料結構。一次只有乙個執行緒可以占有寫模式的讀寫鎖,但是多個執行緒可以同時占有讀模式的讀寫鎖 自旋鎖 互斥量阻塞執行緒的方式是使其進入睡眠,...