// Created by Blake on 14/7/3.
// Copyright (c) 2014年 BLAKE. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//线程
//NSThread
//NSOperation和NSOperationQueue
//GCD(Grand Center Dispatch)
//1.0 NSThread 线程的一般用法
//创建子线程
[NSThread detachNewThreadSelector:@selector(threadMethod) toTarget:self withObject:nil];
//跳回主线程
[self performSelectorOnMainThread:@selector(threadMethod) withObject:nil waitUntilDone:NO];
//创建子线程
NSThread* thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadMethod) object:nil];
thread.name = @"x";//线程的名字
[thread start];//开始线程
[thread cancel];//取消线程 -> thread.isCancelled = YES;
[thread threadPriority];//获取正在执行的线程优先级
[thread setThreadPriority:1.0];//设置优先级范围0~1 1最高级
[NSThread threadPriority];//获取正在执行的线程优先级
[NSThread setThreadPriority:0.1];//设置优先级范围0~1 1最高级
[NSThread sleepForTimeInterval:1];//线程睡眠时间
[NSThread sleepUntilDate:[NSDate date]];//线程睡眠到date
[NSThread currentThread];//获取当前线程
[NSThread isMainThread];//是否主线程
[NSThread isMultiThreaded];//是否多线程
[NSThread exit];//终止线程
//1.1 线程的安全
//经典问题,银行取钱问题,多线程同时操作,出现问题
//解决(1)
//同步代码块,确保块中的代码 ,只被单一线程执行
@synchronized(self){ //self代表同步的监视器
//同步代码块
}
//解决(2)
//NSLock线程锁
NSLock* lock;
[lock lock];//进门上锁
//多线程操作的代码
//确保一次只能进入一个人
[lock unlock];//出门解锁
//解决(3)
//NSCondition
//实现了NSLocking 协议 可以调用lock unlock 来同步 ,
NSCondition* condition;
[condition wait];//使当前线程一直处于等待状态 知道其他线程调用signal或broadcast方法来唤醒
[condition waitUntilDate:[NSDate date]];//控制线程到指定时间
[condition signal];//唤醒等待的单个线程(多个 随机)
[condition broadcast];//唤醒所有线程
//2.0 GCD实现多线程
//1.创建队列(串行队列,并发队列)
//(1.1)串行队列:串行,只有一个线程,从头到尾执行
//(1.1)并发队列:多个线程来执行,按FIFO(first in first out//先进先出) 的顺序并发启动,执行多个并发任务
//2.将任务提交给队列
//2.1 创建队列
//获取全局的并发队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//第一个参数代表优先级 //第二个参数没发现作用
//获取主线程串行队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//创建串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("Que", DISPATCH_QUEUE_SERIAL);
//创建并发队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("Que", DISPATCH_QUEUE_CONCURRENT);
//2.2异步提交任务
//串行队列 挨个执行 先执行代码1 后2
dispatch_async(serialQueue, ^{
//代码1
});
dispatch_async(serialQueue, ^{
//代码2
});
//并行队列 两个代码块可以并发执行
dispatch_async(concurrentQueue, ^{
//代码1
});
dispatch_async(concurrentQueue, ^{
//代码2
});
//获取全局的并发队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
//子线程代码
//主线程代码
dispatch_async(dispatch_get_main_queue(), ^{
});
});
//2.3同步提交任务
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//同步方式 只按照顺序执行,
});
//2.4多次执行的任务
dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t time) {
//time 表示当前正在执行 第几次
});
//2.5只执行一次的任务
static id obj = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//在整个应用生命周期中,只创建一次
//可以用在单例类中,确保线程安全;
obj = [[NSObject alloc]init];
});
//3.0 使用NSOperation和NSOperationQueue实现多线程
//(1)创建NSOperationQueue队列,设置相关属性
//(2)创建NSOperation子类(或NSInvocationOperation,NSBlockOperation) 对象, 并提交给NSOperationQueue队列,
//一般不直接使用NSOperation,而是创建他的子类 然后重写-(void)main;方法
[NSOperationQueue currentQueue];//当前执行的队列
[NSOperationQueue mainQueue];//住线程队列
NSOperationQueue* queue = [[NSOperationQueue alloc]init];
// [queue addOperation:(NSOperation *)];
// [queue addOperations:(NSArray *) waitUntilFinished:(BOOL)];YES同步执行 NO异步执行
[queue operations];//(readonly)返回所有NSOperation对象
[queue operationCount];//(readonly)返回NSOperation对象的数量
[queue cancelAllOperations];//取消队列中的所有NSOperation
[queue waitUntilAllOperationsAreFinished];//阻塞当前线程,直到队列中所有operation执行完成
[queue maxConcurrentOperationCount];//队列最大的支持并发数
[queue setMaxConcurrentOperationCount:5];//设置队列的最大并发数
[queue setSuspended:YES];//暂停正在排队的operation
[queue isSuspended];//是否已暂停正在排队的operation
//创建线程队列
NSOperationQueue* que = [[NSOperationQueue alloc]init];
//AsyMethod异步执行的代码
NSInvocationOperation* invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(AsyMethod) object:nil];
[que addOperation:invocation];//添加到队列中
NSBlockOperation* block = [NSBlockOperation blockOperationWithBlock:^{
//Asy异步执行的代码
}];
[que addOperation:block];//添加到队列中
// Do any additional setup after loading the view, typically from a nib.
}
今天不怎么忙,总结整理了一些关于线程的用法,自己加深理解,也方便有需要的其他人,如果有错误,请批评指正.谢谢!