一.程序 进程 线程
程序:由源代码生成的可执行应用.
进程:一个正在运行的程序可以看做一个进程
线程:程序中独立运行的代码段
****一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程是程序真正的执行单元,只负责代码的执行.
二.单线程 多线程
拥有多个线程的程序,称作多线程程序
子线程和主线程是都是独立运行的单元,各自的执行互不影响,因此能并发执行
三.IOS多线程实现种类
- (void)caculator
{
int sum =0;
@autoreleasepool {
for (int i = 1; i <= 63550000; i++) {
sum +=i;
NSLog(@"sum =%d ",sum);
}
}
}- (void)buttonAction:(id)sender
{
方法一:初始化一个子线程,需要手动开启
NSThread * thread =[[NSThread alloc] initWithTarget:self selector:@selector(caculator) object:nil];
[thread start]; 开始子线程
[thread release];
方法二:初始化一个子线程,自动开启
[NSThreaddetachNewThreadSelector:@selector(caculator)toTarget:self withObject:nil];
}
[self performSelectorInBackground:@selector(caculator) withObject:nil];
3)NSOperation和NSOperationQueue(线程队列)
Operation * mainAc =[[Operation alloc] init];
Operation * second =[[Operation alloc] init];
NSOperationQueue * quene = [[NSOperationQueue alloc] init];
//设置最大并发数 最大并发数为1时 线程与线程是同步的(一个一个走)
[quene setMaxConcurrentOperationCount:1];//设为1 按顺序执行
//添加两个子线程 两个子线程并发执行
[quene addOperation:mainAc];
[quene addOperation:second];
[quene release];
[mainAc release];
[second release];
3) NSBlockOperation
//block里面的内容就是多线程所要执行的代码
NSBlockOperation * block =[NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 10; i++) {
NSLog(@"i= %d",i);
}
}];
NSOperationQueue * quene = [[NSOperationQueue alloc] init];
[quene addOperation:block];
[quene release];
4) NSInvocationOperation
NSInvocationOperation * invocation =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(caculator) object:nil];
NSOperationQueue * quene = [[NSOperationQueue alloc] init];
[quene addOperation:invocation];
[quene release];
5)GCD多线程
- (void)createSerialGCD
{
//第一步:创建一个同步线程队列
dispatch_queue_t queue =dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);
//第二步:异步执行同步线程队列
dispatch_async(queue, ^{
//多线程的代码 不需要加自动释放池 因为是由C语言编写的
//下载一张图片 并显示到界面上 下载用同步下载方式
NSString * path =@"http://v.juhe.cn/movie/picurl?2583081";
NSURL * url =[NSURL URLWithString:path];
NSMutableURLRequest * request =[NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
NSURLResponse * response =nil;
NSError * error =nil;
NSData * data =[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
UIImage *aimage=[UIImage imageWithData:data];
//显示到界面上,所有跟UI相关的内容全部都要在主线程运行
//返回主线程
dispatch_barrier_async(dispatch_get_main_queue(), ^{
//在主线程运行
UIImageView * view =[[UIImageView alloc] initWithFrame:CGRectMake(156, 80, 200, 250)];
view.image =aimage;
[self.view addSubview:view];
[view release];
});
});
}
- (void)createConcurrentGCD
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
});
NSURL * url =[NSURL URLWithString:@"http://ww4.sinaimg.cn/bmiddle/67dd74e0gw1enjmpsjr5tj20c30bk0tw.jpg"];
NSData * data =[NSData dataWithContentsOfURL:url];
UIImage *bimage =[UIImage imageWithData:data];
//主线程 修改就改主线程
dispatch_barrier_async(dispatch_get_main_queue(), ^{
UIImageView * view =[[UIImageView alloc] initWithFrame:CGRectMake(150, 300, 200, 250)];
view.image =bimage;
[self.view addSubview:view];
[view release];
});
}