多執行緒的使用

2021-07-08 12:47:48 字數 3306 閱讀 5595

建立子執行緒的幾種方式

①第一種方式 : 使用執行緒類 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...

多執行緒的使用

執行緒同步的機制包括 互斥鎖,讀寫鎖,自旋鎖,條件變數,訊號量,非同步訊號 讀寫鎖 讀寫鎖與互斥量類似,不過讀寫鎖允許更高的並行性。適用於讀的次數大於寫的次數的資料結構。一次只有乙個執行緒可以占有寫模式的讀寫鎖,但是多個執行緒可以同時占有讀模式的讀寫鎖 自旋鎖 互斥量阻塞執行緒的方式是使其進入睡眠,...