线程间通信

2015-09-23  本文已影响550人  barrylyl

#线程间通信(补一个DEMO

维基百科:指至少两个线程间传送数据或信号的一些方法

##线程间通信的体现

- 一个线程传递数据给另一个线程

- 在一个线程中执行完特定任务后,转到另一个线程继续执行任务

###NSThread

- 在指定线程上执行操作

`[self performSelector:@selector(operate) onThread:thread withObject:nil waitUntilDone:YES]`

- 在主线程上执行操作

`[self performSelectorOnMainThread:@selector(operate) withObject:nil waitUntilDone:YES]`

例:子线程下载图片,然后回主线程刷新UI

##线程共享内存空间

- 优点:线程安全,自动加锁

- 缺点:消耗大量资源(为保证线程安全,会不停加锁)

```

static MyClass _instance

+(id)shareInstance {

static dispatch_once_t onceToken;

dispatch_once (&onceToken, ^{

if(_instance == nil) _instance = [[MyClass alloc] init];

});

return _instance;

}

```

##添加线程依赖关系

- NSOperation:可以利用`NSOperationqueue` 控制单个线程之间关系。

`addDependency:` 添加依赖关系

`removeDependency:` 删除依赖关系

```

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){

NSLog(@"执行NO.1操作,线程:%@", [NSThread currentThread]);

}];

NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){

NSLog(@"执行NO.2操作,线程:%@", [NSThread currentThread]);

}];

// operation1依赖于operation2  (先执行operation2)

[operation1 addDependency:operation2];

[queue addOperation:operation1];

[queue addOperation:operation2];

```

- GCD: 利用Group监控调度一组线程。

```

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{

dispatch_group_t group = dispatch_group_create();

__block UIImage *img1 = nil;

__block UIImage *img2 = nil;

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

img1 = [self loadImg:imgUrl1];

});

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

img2 = [self loadImg:imgUrl2];

});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

self.imgview1.image = img1;

self.imgView2.image = img2;

});

});

```

##信号量(semaphore)

###如何控制线程并发量

- NSOperation: 我们可以利用`NSOperationqueue`来控制单个线程间关系, `setMaxConcurrentOperationCount` 这个函数来控制最大并发量。

```

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//每次执行‘number’个操作

[queue setMaxConcurrentOperationCount:number];

```

- GCD: 在GCD中我们可以利用dispatch_semaphore来处理控制并发。

####信号量:是一个整形值并且具有一个初始计数值。有两个操作分别为:通知和等待。

semaphore

- dispatch_semaphore_create: 创建一个整形数值的信号,即:信号的总量

- dispatch_semaphore_signal: 发送一个信号,让信号总量增加1

- dispatch_semaphore_wait: 首先判断信号量是否大于零,如果大于零则减掉1个信号量,往下执行,如果等于零则阻塞该线程

上一篇下一篇

猜你喜欢

热点阅读