首页 > 编程语言 > 详细

多线程

时间:2016-02-17 12:36:20      阅读:125      评论:0      收藏:0      [点我收藏+]
程序:就是代码?成的可执?的应?。    
进程:跑起来的程序。      
线程:程序中独?运?的代码段。(block就是)。      
?个进程是由多个线程(?个以上)组成的。进程申请资源和分配资源给线程?,线程?到资源。   
 
每个进程都包含?少?个线程,即主线程。主线程在程序跑动的时候被创建,?于执?main函数?的东西。 
 
主线程负责的是,所有代码的执?,包括UI更新,?络请求,本地存储等等。
主线程的代码都是顺序执?,不能并?执?。 
 
?户可以开辟许多新的线程,这些线程都是主线程的?线程。 
注意的是,主线程和?线程都是相互独?执?代码的,互不影响,并发执?。 
 
注意:UI更新,必须放在主线程中去更新。因为开辟的?线程,是不受控制的,什么时候执?完毕我们?法控制。再?线程更新UI出现的bug?法预料。
NSThread是相对于后?两个NSOperationQueue、GCD来说,是?个轻量级的多线程。
 
//
//  ViewController.m
//  多线程
//
//  Created by cqy on 16/2/16.
//  Copyright © 2016年 程清杨. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
{
    NSThread *_thread;
    int i ;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSThread *newThead = [NSThread currentThread];//获取当前线程
    NSThread *mainThead = [NSThread mainThread];//获取主线程
    [newThead setName:@"线程名"];
    if ([newThead isMainThread]) {
        NSLog(@"currentThread = %@",mainThead);
    }
   
   
    //第一种创建NSThread(第?种创建?式:需要?动启动[thread start];也要?动结束[thread cancel];?线程。)
   //第?个参数:随来执?
   // 第?个参数:去执?什么?法?这个?法??般是?线程要完成的?些事:(?络请求,或者其他)。
   // 第三个参数:去执?的那个?法,顺便带?个参数过去。
   
   // NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadAction:) object:nil];
    //手动开启线程
    //[thread start];
    //结束线程
    //[thread cancel];
    // //第?种创建?式:不需要?动去开启?线程。参数意义与第?种?样。
   // [NSThread detachNewThreadSelector:@selector(threadAction:) toTarget:self withObject:@"qwe"];
    //隐式创建线程
    //[self performSelectorInBackground:@selector(threadAction:) withObject:self];
    // 在主线程上执行
    [self performSelectorOnMainThread:@selector(Open) withObject:self waitUntilDone:YES];
    // Do any additional setup after loading the view, typically from a nib.
}
-(void)Open{
    NSLog(@"open...");
    //新创建一个子线程
    [NSThread detachNewThreadSelector:@selector(threadAction:) toTarget:self withObject:@"qwe"];
   
   
}
-(void)threadAction:(NSThread *)sender{
     NSLog(@"threadAction...");
    NSTimer *timer=[NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(timeSchedule) userInfo:nil repeats:YES];
   
    NSRunLoop *runLoop=[NSRunLoop currentRunLoop];
   
    [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
    while ([runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
  
}
-(void)timeSchedule{
     NSLog(@"timeSchedule...");
  
    NSLog(@"now is %d",i++);
    //在指定线程上执行操作
    _thread = [[NSThread alloc]initWithTarget:self selector:@selector(WillClose) object:nil];
    //暂停当前线程几秒
    [NSThread sleepForTimeInterval:3];
    [_thread start];
   }
-(void)WillClose{
  
        NSLog(@"will close...");
   
    [self performSelector:@selector(Close) onThread:_thread withObject:nil waitUntilDone:YES];
    }
-(void)Close{
    NSLog(@"close............");
    //停止当前线程
    [NSThread exit];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
注意:
再多线程?法中,需要添加?动释放池。
应?程序再启动时,系统?动为主线程创建了?动释放池。我们?动添加的?
线程,需要添加?动释放池。
 */
@end
 
NSOperation  
NSOperation  
mvc中属于M层,?来封装单个任务的相关代码的?个抽象类。这个抽象类不能直接使?,?是?它的?类来执?实际任务。    
NSOperation只是?个操作,本?并没有主线程、?线程之分,可以使?再任意线程中。通常与NSOperationQueue?起使?。
//
//  ViewController.m
//  多线程02-NSOperation
//
//  Created by cqy on 16/2/16.
//  Copyright © 2016年 程清杨. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSInvocationOperation *inOp = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationAction:) object:nil];
    [inOp start];
    //封装了要执?的代码块。要执?的代码都放在block?执?了。
    NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"block操作0:%@",[NSThread currentThread]);
       
        }];
    //在NSBlockOperation对象中添加一个操作,如果NSBlockOperation对象包含了多个操作,有一个是在主线程中执行,其他均在子线程中
    [blockOp addExecutionBlock:^{
        NSLog(@"block操作1:%@",[NSThread currentThread]);
    }];
    [blockOp addExecutionBlock:^{
        NSLog(@"block操作2:%@",[NSThread currentThread]);
    }];
   
    [blockOp start];
  
    //注意:添加操作之前要放在start之前
    //创建队列:将操作放入队列中(主队列除外),默认在子线程中执行,且不需要手动start
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSInvocationOperation *Operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run2) object:nil];
    [queue addOperation:Operation];
    [queue addOperationWithBlock:^{
        NSLog(@"block操作队列3:%@",[NSThread currentThread]);
    }];
   
    // Do any additional setup after loading the view, typically from a nib.
}
-(void)run2{
    NSLog(@"队列执行操作4:%@",[NSThread currentThread]);
}
-(void)operationAction:(NSInvocationOperation *)sender{
    NSLog(@"operationAction....");
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
 
GCD
 
GCD是苹果公司封装好的?个系统,?来应对多核处理系统。gcd?部分代码都是函数的多线程,性能?,功能强?。      
GCD以队列的?式进??作,先进先出(o),GCD根据分发队列的的类型,创建适量线程,完成?作。     
cgd分为三种队列:     
主队列,全局队列,?定义队列。 
1、串?队列:前?个任务完成,才能执?下?个任务(包括主队列和?定义队列)   
2、并?队列:各个任务独?执?,互不?扰,也是先进先出(包括了全局队列和?定义队列)。 
 
//
//  ViewController.m
//  多线程03-GCD
//
//  Created by cqy on 16/2/16.
//  Copyright © 2016年 程清杨. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self oneMain];
    [self twoMain];
    [self threeMain];
    [self fourMain];
   
    // Do any additional setup after loading the view, typically from a nib.
}
-(void)oneMain{
    // 主队列(串)
    //dispatch_queue_t是?个类型,mainQueue是类型的实例名。
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    //dispatch_get_main_queue(),获取主队列
    // 添加任务(三种队列都?这个?法添加)
    dispatch_async(mainQueue, ^{
        //dispatch_async(mainQueue,^(block)),这个?法是吧任务添加到mainQueue主队列中。block块?是要执?的任务。
        NSLog(@"第1个任务,当前线程:%@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"第2个任务,当前线程:%@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"第3个任务,当前线程:%@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"第4个任务,当前线程:%@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"第5个任务,当前线程:%@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
         NSLog(@"第6个任务,当前线程:%@",[NSThread currentThread]);
    });
    //解释:1、dispatch_queue_create 是创建?定义队列的?式。第?个参数是队列标?符,第?个参数是告诉系统,这个队列是串?的。2、dispatch_async,添加任务到myQueue1这个?定义队列中。block块中是执?的任务。
}
-(void)twoMain{
    // ?定义队列(串)
    // 第?个参数,告诉是串?的。
    dispatch_queue_t myQueue = dispatch_queue_create("myQ1",   DISPATCH_QUEUE_SERIAL);
    dispatch_async(myQueue, ^{
        NSLog(@"第01个任务,当前线程:%@",[NSThread  currentThread]);
    });
    dispatch_async(myQueue, ^{
        NSLog(@"第02个任务,当前线程:%@",[NSThread currentThread]);
    });
    dispatch_async(myQueue, ^{
        NSLog(@"第03个任务,当前线程:%@",[NSThread currentThread]);
    });
    dispatch_async(myQueue, ^{
        NSLog(@"第04个任务,当前线程:%@",[NSThread currentThread]);
    });
   
}
-(void)threeMain{
    // 全局(并?)
    dispatch_queue_t globelQ =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                              0);
    dispatch_async(globelQ, ^{
        NSLog(@"第-1个任务,当前线程为:%@",[NSThread currentThread]);
    });
    dispatch_async(globelQ, ^{
        NSLog(@"第-2个任务,当前线程为:%@",[NSThread currentThread]);
    });
    dispatch_async(globelQ, ^{
        NSLog(@"第-3个任务,当前线程为:%@",[NSThread currentThread]);
    });
    dispatch_async(globelQ, ^{
        NSLog(@"第-5个任务,当前线程为:%@",[NSThread currentThread]);
    });
    dispatch_async(globelQ, ^{
        NSLog(@"第-6个任务,当前线程为:%@",[NSThread currentThread]);
    });
    // 解释dispatch_get_global_queue创建?个全局队列。DISPATCH_QUEUE_PRIORITY_DEFAULT:队列的优先级,default是系统默认。
   
   
   
}
-(void)fourMain{
    // ?定义(并?)
    dispatch_queue_t myQueue2 = dispatch_queue_create("Q2",          DISPATCH_QUEUE_CONCURRENT);
   
    dispatch_async(myQueue2, ^{
        NSLog(@"第1-个任务,当前线程为:%@",[NSThread currentThread]);
    });
    dispatch_async(myQueue2, ^{
        NSLog(@"第2-个任务,当前线程为:%@",[NSThread currentThread]);
    });
    dispatch_async(myQueue2, ^{
        NSLog(@"第3-个任务,当前线程为:%@",[NSThread currentThread]);
    });
    dispatch_async(myQueue2, ^{
        NSLog(@"第4-个任务,当前线程为:%@",[NSThread currentThread]);
    });
    //解释:dispatch_queue_create 创建?定义队列。第?个参数是队列标?符,第?个参数:DISPATCH_QUEUE_CONCURRENT是告诉系统,创建的是并?的队列。

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
 
 
 
 
 

多线程

原文:http://www.cnblogs.com/iQingYang/p/5194713.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!