您的当前位置:首页正文

OC中的多线程技术(一)

来源:要发发知识网

多线程的概述##

  1. 进程和线程
      进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行时通常拥有独立的内存单元,而线程之间可以共享内存。使用多线程的编程通常能够带来更好的性能和用户体验,但是多线程的程序对于其他程序是不友好的,因为它可能占用了更多的CPU资源。当然,也不是线程越多,程序的性能就越好,因为线程之间的调度和切换也会浪费CPU时间。
  2. 串行和并行
      当一个线程执行多个任务,会采用执行完一个再执行下一个的方式,这种执行任务的方式称为串行;多个线程分担多个任务,不同的任务同时执行,这种执行任务的方式称为并发。
  3. 同步和异步
      同步是指当前一个任务未能完成时,后一个任务被阻塞;异步可以理解为不同的任务在不同的线程中执行,当开辟的子线程(工作线程)发生阻塞,主线程或其他线程不会受到影响。

说明:异步和并发的概念不完全相同,异步强调解决主线程阻塞的问题,而并发一般指子线程(工作线程)之间的关系,多个工作线程分担任务称为并发执行任务。

iOS多线程##

在iOS中进程启动后都会建立一个主线程,这个线程为其他线程的父线程。在iOS中除了主线程,其他子线程是独立于Cocoa Touch的,所以更新界面时必须在主线程下进行。常见的多线程开发有三种方式:

  • NSThread类:此种方式是轻量级的线程机制,但需要自行管理线程的生命周期,线程同步等问题,同步锁会产生系统开销。
  • NSOperationQueue类:执行队列,优点是不需要关心线程管理,数据同步的事情,可以把精力放在线程需要执行的操作上。
  • GCD:Grand Central Dispatch,是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6,iOS 4及以上也可以使用,该技术是取代上述技术的技术。

NSThread##

创建线程的方式有两种:

  • 类方法
[NSThread detachNewThreadSelector:(SEL)aSelector toTarget:
(id)aTarget withObject:(id)anArgument];
  • 对象方法
NSThread *thread = [[NSThread alloc] initWithTarget:
(id)aTarget selector:(SEL)aSelector object:(id)anArgument];
[thread start];

// 进程:是操作系统进行资源分配和调度的一个独立单位
// 线程:线程是操作系统分配CPU的基本单元,一个进程可以包含多个线程。
// 使用多线程主要有两个好处:
// 1. 提升程序执行效率。
// 2. 带来更好的用户体验。

#import "ViewController.h"
#ifndef W_H
#define W_H
#define WIDTH self.view.bounds.size.width
#define HEIGHT self.view.bounds.size.height
#endif
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

>  [self createUI];
  [self doSomething];

}

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

- (void)createUI{
  for (int i = 0; i < 2; i ++) {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(0, 0, WIDTH / 3, HEIGHT / 20);
    button.center = CGPointMake(WIDTH / 2, HEIGHT / 3 + i * HEIGHT / 3);
     button.tag = 200 + i;
    [button setTitle:[NSString stringWithFormat:@"任务%d",i + 1] forState:UIControlStateNormal];
    [self.view addSubview:button];
  }
}

- (void) bigTask:(UIButton *) button {
  sleep(10);
  // 刷新界面和处理用户交互的操作必须在主线程上执行
  [self performSelectorOnMainThread:@selector(refreshButton1:) withObject:button waitUntilDone:YES];
}

- (void) refreshButton1:(UIButton *)button {
  NSLog(@"刷新: %@", [NSThread currentThread]);
  [button setTitle:@"任务1完成" forState:UIControlStateNormal];
}

- (void)button2Clicked:(UIButton *) sender{
  [sender setTitle:@"任务2完成" forState:UIControlStateNormal];
}
@end