Thread currentThread]);
}
}];
[operation3 addExecutionBlock:^{
for (int i = 0; i < 5; i ++) {
NSLog(@"块队列2:------------%@",[NSThread currentThread]);
}
}];
//设置操作依赖:一定要在添加之前进行设置
[operation3 addDependency:operation1];
[operation1 addDependency:operation2];
//创建操作队列,把操作添加到队列当中。任务添加的顺序并不能决定执行顺序,执行的顺序取决于依赖。
//使用Operation的目的就是让开发人员不再关心线程
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
}
-(void)test1
{
for (int i = 0; i < 5; i ++) {
NSLog(@"调用队列1-------%@",[NSThread currentThread]);
}
}
- (void)test2
{
for (int i = 0; i < 5; i ++) {
NSLog(@"调用队列2-------%@",[NSThread currentThread]);
}
}
三。操作的监听
1.可以监听一个操作的执行完毕。
2.如下:
operation3.completionBlock = ^{
NSLog(@"请继续操作");
};
//===========================
//NSThread线程的相关操作
使用古老的方式创建线程:pthread_t
使用NSThread创建线程
1.创建线程
启动线程
2.创建线程后自动启动线程
3.隐式创建线程并启动线程
主线程相关:获得主线程,是否为主线程
获取和设置线程的优先级
获得当前线程
获取和设置线程的名字
线程暂停一段时间(线程阻塞)
退出线程(线程死亡,人死不能复生)
线程安全:
多线程的安全隐患:资源共享、
解决方案:
1.@synchronized(互斥锁);
2.原子性和非原子性
OC在定义属性时有nonatomic和atomic两种选择
atomic:原子属性,为setter方法加锁(默认就是atomic)。线程安全,需要消耗大量的资源
nonatomic:非原子属性,不会为setter方法加锁。非线程安全,适合内存小的移动设备
但是,
iOS开发的建议
所有属性都声明为nonatomic
尽量避免多线程抢夺同一块资源
尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力
线程间的通信:
1.线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
2.线程间通信的体现
1个线程传递数据给另1个线程
在1个线程中执行完特定任务后,转到另1个线程继续执行任务