NSThread 的创建与启动
[NSThread detachNewThreadSelector:@selector(testNSThread:) toTarget:self withObject:nil]; //第一种创建方法
[self performSelectorInBackground:@selector(testNSThread:) withObject:nil]; //第二种创建方法
NSThread* testThread= [[NSThread alloc] initWithTarget:self selector:@selector(testNSThread:) object:nil];//第三种创建方法
[testThread star];
区别:第一种调用方法会立即创建一个线程来执行指定的任务,第二种效果与第一种是一样的,第三种调用方法直到我们手动 star 启动线程时才会去真正创建线程。
线程的暂停、取消、停止
[NSThread sleepForTimeInterval:1.0]; (暂停线程xx时间)
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];(暂停线程直到指定时间)
//NSThread的暂停会有阻塞当前线程的效果
[testThread cancel];
//取消线程并不会马上停止并退出线程,仅仅对线程做了一个标记
[NSThread exit];
//停止方法会立即终止除主线程以外所有线程
获取线程
[NSThread currentThread];//获取当前线程
[NSThread mainThread];//获取主线程
线程间的通讯
**指定当前线程执行任务**
[self performSelector:@selector(testNSThread:)];
[self performSelector:@selector(testNSThread:) withObject:nil];
[self performSelector:@selector(testNSThread:) withObject:nil afterDelay:2.0];
**在子线程中指定主线程执行任务(比如刷新UI)**
[self performSelectorOnMainThread:@selector(refreshUI) withObject:nil waitUntilDone:YES];
**在主线程中指定子线程执行任务**
[self performSelector:@selector(testNSThread:) onThread:testThread withObject:nil waitUntilDone:YES];//指定名为 testThread 子线程执行任务
[self performSelectorInBackground:@selector(testNSThread:) withObject:nil];//创建一个后台线程执行任务
```
####线程同步
*在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性*
**iOS 实现线程加锁有 NSLock 和 @synchronized 两种方式**
```
_testArr = [NSMutableArray array];
_testlock = [[NSLock alloc] init];
NSThread* threadOne= [[NSThread alloc] initWithTarget:self selector:@selector(testLock :) object:nil];
[threadOne star];
NSThread* threadTwo= [[NSThread alloc] initWithTarget:self selector:@selector(testLock :) object:nil];
[threadTwo star];
** NSLog 实现同步锁**
- (void)testLock:(id)obj {
[_testlock lock];
[_testArr addObject:obj];
[_testlock unlock];
}
** @synchronized 实现同步锁**
- (void)testLock:(id)obj {
@synchronized (_testArr) {
[_testArr addObject:obj];
}
}
```
[详细点击这里](http://dwz.cn/5ylBI4)