[关闭]
@SanMao 2015-08-06T00:31:07.000000Z 字数 2171 阅读 1632

线程状态/互斥锁/通信

多线程


线程的5种状态

  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
  2. // 线程的新建
  3. NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
  4. // 线程开始(start)
  5. [thread start];
  6. NSLog(@"开始执行子线程");
  7. }
  8. - (void)run{
  9. for (int i = 0 ; i< 50; i++) {
  10. NSLog(@"%d",i);
  11. if (i % 5 == 0) {
  12. // 让线程休息2秒(阻塞)
  13. [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
  14. NSLog(@"线程正在休息");
  15. if (i == 30) {
  16. // 结束线程(死亡)
  17. NSLog(@"子线程挂了");
  18. [NSThread exit];
  19. /*简单粗暴地结束方式:return;*/
  20. }
  21. }
  22. }
  23. }

互斥锁/线程同步(@synchronized(对象))

原子和非原子属性

注意点

线程间通信

  1. - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
  2. - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
  3. // waitUntilDone的含义:
  4. 如果传入的是YES: 那么会等到主线程中的方法执行完毕, 才会继续执行下面其他行的代码
  5. 如果传入的是NO: 那么不用等到主线程中的方法执行完毕, 就可以继续执行下面其他行的代码
  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  2. // 执行耗时的异步操作...
  3. dispatch_async(dispatch_get_main_queue(), ^{
  4. // 回到主线程,执行UI刷新操作
  5. });
  6. });
  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
  2. // 穿件队列,获取全局并行队列
  3. dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
  4. // 添加下载任务到子线程中
  5. dispatch_async(queue, ^{
  6. NSLog(@"%@",[NSThread currentThread]);
  7. // 下载图片
  8. NSURL *url = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/1b4c510fd9f9d72aee889e1fd22a2834359bbbc0.jpg"];
  9. NSData *data = [NSData dataWithContentsOfURL:url];
  10. UIImage *image = [UIImage imageWithData:data];
  11. // 显示UI控件,将此任务加入到主队列中
  12. // 如果是通过异步函数添加任务,会先执行完所有代码再来执行block中的任务
  13. // 如果是通过同步函数添加的任务,会先执行完block中的任务再执行其他代码
  14. dispatch_async(dispatch_get_main_queue(), ^{
  15. NSLog(@"%@",[NSThread currentThread]);
  16. self.imageView.image = image;
  17. });
  18. });
  19. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注