1.创建线程
两种方式:
//初始化方法
thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(reduceCount)object:nil];
[thread1 setName:@"减少count"];
[thread1 start];//需要手动开始
//类方法:直接开始
thread1 = [NSThread detachNewThreadSelector:@selector(reduceCount) toTarget:selfwithObject:nil];
2.在外部停止线程
首先取消线程:
[thread1 cancel];
然后在调用的方法内退出线程:
if (thread1.isCancelled) {
[NSThread exit];
}
3.让线程暂停
[NSThread sleepForTimeInterval:1.0];
[NSThread sleepUntilDate:date];
4.在主线程中更新UI
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
- (void)updateUI:(UIImage *)image
{
self.iv.image = image;
}
5,改变线程的优先级
每个线程执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。每个子线程默认的优先级为0.5.
thread1.threadPriority = 1.0;
thread2.threadPriority = 0.0;
6.线程同步与线程通信
使用@synchronized关键字
@synchronized(self)
{
}
该关键字会降低程序的运行效率,因此只需对可能改变共享资源的方法使用该关键字.
同步锁(NSLock)
[lock lock];
...代码
[lock unlock];
7.使用NSCondition控制线程通信
NSCondtion实现了NSLocking协议,因此也可以调用lock,unlock来实现线程同步。除此之外,NSCondition可以让那些已经锁定NSCondition对象却无法继续执行的线程释放NSCondition对象,NSCondition对象也可以唤醒其他处于等待状态的线程。
NSCondition提供以下三个方法:
-wait:导致该线程一直等待,直到其他线程调用该NSCondition的signal方法或者broadcast方法唤醒该线程。
-signal:唤醒在此NSCondition对象上等待的单个线程(如果有多个线程则随机唤醒其中一个)
- broadcast:唤醒在此NSCondition对象上等待的所有线程。只有当前线程放弃对该NSCondition对象的锁定后,才可以执行被唤醒的线程.
- (void)add
{
for (int i = 0; i < 500; i ++)
{
if (count>100) {
[cond broadcast];
[cond wait];
}
count++;
NSLog(@"count= %d",count);
[NSThread sleepForTimeInterval:0.1];
}
}
- (void)reduce
{
for (int i = 0; i < 500; i ++)
{
if (count<1)
{
[cond broadcast];
[cond wait];
}
count--;
NSLog(@"count=%d",count);
[NSThread sleepForTimeInterval:0.1];
}
}
8.线程通信的主要方法
[self performSelector:@selector(run) onThread:thread1 withObject:image waitUntilDone:YES];