- 線程
- 主線程
- 后臺線程
-
線程是被模擬出來的达布,CPU通過分配時間片的方法模擬出多線程
-
NSThread創(chuàng)建一個線程
- 對象方法
// 對象方法 NSThread *thread1 = [[NSThread alloc] initWithBlock:^{ ... }]; [thread1 start];
- 類方法
// 類方法 [NSThread detachNewThreadWithBlock:^{ ... }];
- 繼承對象
@interface testThread : NSThread @end @implementation testThread - (void)main { ... } @end
// 繼承方法 testThread *thread_t = [[testThread alloc] init]; thread_t.delegate = self; [thread_t start];
-
線程的狀態(tài)
優(yōu)雅的取消一個線程
// way1,該線程立刻退出产还,若果該線程退出前線程中申請的資源沒有釋放容易造成內(nèi)存泄漏
+ (void)exit
// way2脐区,不作特殊處理該線程會繼續(xù)執(zhí)行
- (void)cancel
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
_thread1 = [[NSThread alloc] initWithBlock:^{
NSLog(@"thread start");
for (NSInteger i = 0; i <= 100; i ++) {
NSLog(@"%@ --- %ld", _thread1, (long)i);
sleep(1);
if ([[NSThread currentThread] isCancelled]) {
break;
}
}
NSLog(@"thread end");
}];
[_thread1 start];
}
#pragma mark - Button methods
- (IBAction)handleCancelThread:(id)sender {
[_thread1 cancel];
_thread1 = nil;
}
- 線程相關(guān)的方法
+ (BOOL)isMainThread; // 當(dāng)前的代碼執(zhí)行的線程是否是主線程
+ (NSThread *)currentThread; // 當(dāng)前代碼執(zhí)行的線程
+ (NSThread *)mainThread; // 獲取主線程
- 暫停線程的方法
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
- 線程通信
@interface NSObject (NSThreadPerformAdditions)
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg
@end
-
多線程優(yōu)點
- 提高APP實時響應(yīng)性能
- 充分利用計算資源
-
多線程缺點
- 線程安全
- 復(fù)雜度提升
- 需要額外的系統(tǒng)開銷
- 線程的開銷
-
線程同步問題
-
線程同步的方法
- NSLock
@protocol NSLocking // 訪問變量前后使用 - (void)lock; - (void)unlock; @end @interface NSLock : NSObject <NSLocking> { @private void *_priv; } - (BOOL)tryLock; - (BOOL)lockBeforeDate:(NSDate *)limit; @property (nullable, copy) NSString *name API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)); @end
- synchronized
@synchronized (self) { a ++; }
-
死鎖