iOS之多线程精髓
来源:互联网 发布:js placeholder赋值 编辑:程序博客网 时间:2024/05/16 05:23
一个正在运行的程序叫做进程,线程是进程的基本执行单元。进程中的任务在线程中执行。
一个进程中默认有一条主线程,单一线程中任务执行是串行的。多条线程可以同时执行不同任务。
多线程原理
同一时间cpu只能处理一条线程,多线程并发执行,是CPU快速的在多条线程中切换形成的假象。
主线程
NSThread*thread = [[NSThreadalloc] initWithTarget:selfselector:@selector(run)object:nil];
[thread start];
+ (NSThread *)mainThread; //获得主线程
- (BOOL)isMainThread; //是否为主线程
+ (BOOL)isMainThread; //是否为主线程
- (void)setName:(NSString *)n;
- (NSString*)name;
[NSThread detachNewThreadSelector:@selector(run)toTarget:selfwithObject:nil];
[self performSelectorInBackground:@selector(run)withObject:nil];
- (void)start;
// 进入就绪状态 ->运行状态。当线程任务执行完毕,自动进入死亡状态
+ (void)sleepUntilDate:(NSDate*)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 进入阻塞状态
+ (void)exit;
// 进入死亡状态
注意:一旦线程停止(死亡)了,就不能再次开启任务
@synchronized(锁对象) { // 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的
优点:
<1> GCD 能够自动利用更多的CPU的核数(双核/四核)!
<2> GCD 会自动管理线程的生命周期.
1> dispatch_async + 全局并发队列 (可以开启多条线程)
2> dispatch_async + 自己创建的串行队列 (开启一条线程)
dispatch_sync(dispatch_queue_tqueue,dispatch_block_tblock);
dispatch_async(dispatch_queue_tqueue,dispatch_block_tblock);
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//执行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(),^{
// 回到主线程,执行UI刷新操作
});
});
[self performSelector:@selector(run)withObject:nilafterDelay:2.0];
// 2秒后再调用self的run方法
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 *NSEC_PER_SEC)), dispatch_get_main_queue(),^{
//2秒后执行这里的代码...在哪个线程执行,跟队列类型有关
});
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//只执行1次的代码(这里面默认是线程安全的)
});
ARC
+ (instancetype)sharedMusicTool {
if (_instance ==nil) { // 防止频繁加锁
@synchronized(self) {
if (_instance ==nil) { // 防止创建多次
_instance = [[selfalloc] init];
}
}
}
return _instance;
}
- (id)copyWithZone:(struct_NSZone*)zone {
return _instance;
}
- (id)retain { return self; }
- (NSUInteger)retainCount { return 1; }
- (oneway void)release{}
- (id)autorelease { return self; }
.单例实现:(两种方式:互斥锁(@synchronized(self))和一次性代码(dispatch_once));
//(1)重写 allocWithZone:方法,在这里创建唯一的实例(注意线程安全). //alloc 内部都会调用这个方法.
+(instancetype)allocWithZone:(struct _NSZone *)zone {
if (_instance ==nil) { // 防止频繁加锁
@synchronized(self) {
if (_instance ==nil) { // 防止创建多次
_instance = [super allocWithZone:zone];
}
}
}
return _instance;
}
//(2)重写 copyWithZone:方法.
+(id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
- (id)initWithTarget:(id)targetselector:(SEL)selobject:(id)arg;
- (void)start;
+ (id)blockOperationWithBlock:(void (^)(void))block;
- (void)addExecutionBlock:(void (^)(void))block;
- (void)addOperation:(NSOperation*)op;
-(void)addOperationWithBlock:(void (^)(void))block- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
- (void)cancelAllOperations;
提示:也可以调用NSOperation的- (void)cancel方法取消单个操作
- (void)setSuspended:(BOOL)b;//YES代表暂停队列,NO代表恢复队列
- (BOOL)isSuspended;
- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;
- iOS之多线程精髓
- iOS 之多线程 NSThread
- iOS 之多线程
- IOS开发之多线程
- Mac&iOS之多线程
- Mac&iOS之多线程
- IOS之多线程GCD
- iOS之多线程编程
- IOS编程之多线程
- Mac&iOS之多线程
- iOS 之多线程
- Mac&iOS之多线程
- iOS之多线程
- iOS学习之多线程
- iOS开发之多线程
- iOS开发之多线程
- iOS网络之多线程
- iOS之多线程
- C语言学习---存储类
- Java和.Net在做BS结构项目的比较
- iOS常用正则表达式
- 本人使用的vim配置
- Intellij IDEA依赖同步及乱码问题
- iOS之多线程精髓
- C语言学习记录(七):C语言的核心——函数
- 50个PHP程序性能优化的方法
- Cmd Markdown 简明语法手册
- Java实现多线程下载文件
- Android 秘密社交
- Android 程序员必须掌握的三种自动化测试方法
- GitHub 优秀的 Android 开源项目
- java设计模式-单例模式