标签:
程序:由源代码生成的可执行的程序.
进程:一个运行的程序可以看成一个进程,进程拥有独立运行的全部资源.
线程:程序中独立运行的代码段.
一个进程由一个或多个线程组成,进程只负责资源的调度和分配,线程才是程序真正的执行单元.负责代码的执行.
每一个正在运行的程序,至少包涵一个线程,这个线程叫主线程.只有一个主线程的程序称为单线程程序.代码顺序执行,容易出现代码阻塞.为了避免出现代码阻塞,我们有时需要自己开辟新的线程,提高程序的运行性能.
NSThread是一个轻量级的多线程.
初始化NSThread有两个方式;
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(action:) object:@"hello,world"];//子线程执行的方法和所需的参数.不需要参数就给nil;
//开启多线程
[thread start]; //实例方法,但需要手动开启.
第二个类方法
// 使用系统的
[NSThread detachNewThreadSelector:@selector(action) toTarget:self withObject:nil];
NSOperation在MVC中属于M,是用来封装单个任务相关的代码和数据的抽象类,不能直接使用这个类,而是用其子类来执行实际任务.如NSInvocationOperation,NSBlockOperation.
代码如下:
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(action:) object:@"hello,world"];
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(Action) object:nil];
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 1000; i++) {
NSLog(@"%d", i);
}
}];
//队列来管理一个或多个任务
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//绑定一个任务,就是前者必须等后者执行完
[operation addDependency:blockOperation];
//[queue setMaxConcurrentOperationCount:2];
//将任务加到队列中
[queue addOperation:operation];
[queue addOperation:operation1];
[queue addOperation:blockOperation];
//[queue addOperations:[NSArray arrayWithObjects:blockOperation,operation1, nil] waitUntilFinished:YES];
GCD是苹果公司开发的技术,以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.GCD属于函数级的多线程,性能更高,功能更强大.
关于gcd有两种队列,serialQueue.一次只执行一个任务 ;
#pragma mark -- gcd之串行 serial
//串行特点 一个一个执行, 一个执行完再执行下一个
//1.系统自带串行队列
//创建系统主列队
#warning 重点,经常用到,作用:从子线程上得到主线程
// dispatch_queue_t mainQueue = dispatch_get_main_queue();
//1.2执行主队列
// dispatch_async(mainQueue, ^{
//
// NSLog(@"hello,world");
// NSLog(@"1= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
// });
// dispatch_async(dispatch_get_main_queue(), ^{
//
// NSLog(@"获得主线程的大众写法");
// });
//2.自定义串行队列
//创建自定义串行队列
//参数1.队列标示符 一般是逆向域名
//参数2.队列类型
//dispatch_queue_t mySerialQueue = dispatch_queue_create("com.myself.GCD.serial", DISPATCH_QUEUE_SERIAL);
//2.2执行队列
// dispatch_async(mySerialQueue, ^{
//
// NSLog(@"1= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
// NSLog(@"2= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
// NSLog(@"3= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
// NSLog(@"4= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
// });
concurrent,可以并发的执行多个任务,但遵循FIFO
//自定义并行队列
//创建自定义并行队列
//dispatch_queue_t myConcurrentQueue = dispatch_queue_create("com.myself.GCD.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
/* dispatch_async(myConcurrentQueue, ^{
NSLog(@"1= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
NSLog(@"2= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
NSLog(@"3= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
for (int i = 0; i < 10000; i++) {
NSLog(@"%d", i);
}
NSLog(@"4= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
NSLog(@"5= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
NSLog(@"6= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
NSLog(@"7= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
});*/
// dispatch_async(myConcurrentQueue, ^{
//
// for (int i = 0; i < 10000; i++) {
// NSLog(@"%d", i);
// }
//
// });
接下来是GCD的一些其他方法
// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//
// NSLog(@"7= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
// });//延迟多少秒执行
//只能执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"7= %@, %d", [NSThread currentThread], [NSThread isMainThread]);
});
标签:
原文地址:http://www.cnblogs.com/myselfxiaoxiao/p/4293916.html