0915-多线程 网络开始

---------------------

 0915 线程 网络   面试经常问

复习看这里就可以了:

队列中放Thread (执行代码的方法)

一个Thread 只能做一个事情    串行队列(单列 一把只有一个线程 )   并行队列(多个线程)

串行队列 只开一个新线程  顺序执行多个任务  无异步多线程效果

dispatch_async表示可以开启新线程能力

并行队列 可以开多个线程  不按照顺序来  做多个事情  自动开启多个线程   一般不超过5个线程(包括主线程)

dispatch_async 将事情  放到并行队列中去执行   多线程   [如果放到串行队列那就没有异步效果了,因为是在串行队列中  一般只开一条线程]

dispatch_sync   将事情  放到串行队列中去执行   单线程   [如果放到并发队列里,还是一条线程]

 

后台表示子线程  

由于UI属性都是nonatomic  没有加锁   所以让设置属性和相应事件都在主线程中,防止多线程设置同一个属性(那就乱了)

 NSThread方法不能利用多核   所以推荐使用GCD 包括主线程Thread不超过5条

GCD :

1、dispatch_async + dispatch_get_global_queue(并行队列) 最常用  下载图片操作

2、dispatch_async + dispathch_queue_create("abc", DISPATCH_QUEUE_SERIAL);//创建一个串行队列   如果是并行队列DISPATCH_QUEUE_CONCURRENT可以写NULL

非ARC需要手动释放 手动创建的队列 dispatch_release();

3、dispatch_async + dispatch_get_global_queue(); // 主队列-串行队列-里面只有一个主线程  不开新线程

注意点:死循环不执行的代码:不要使用这个 dispatch_sync + dispatch_get_global_queue();  因为syncMainQueue也是在主队列中(串行队列)  导致下载图片1要等待syncMainQueue执行完毕

   // 线程之间通讯 回到主线程,刷新UI界面(为了线程安全)
    [self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];//不等主线程downLoad执行完毕  继续往下
//    [self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];//等主线程执行完毕downloadFinish才继续往下
//    [self.imageView performSelectorOnMainThread:@selector(setImageWithImage:) withObject:image waitUntilDone:NO];//等主线程执行完毕 才继续往下

    // 获得全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  // 默认优先级为0.5
    // 将 任务 添加 全局队列 中去 异步 执行
    dispatch_async(queue, ^{
        NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
    });

 

线程之间通讯 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    dispatch_async(HMGlobalQueue, ^{
        NSLog(@"donwload---%@", [NSThread currentThread]);
        // 1.子线程下载图片
        NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        
        // 2.回到主线程设置图片
        dispatch_async(HMMainQueue, ^{
            NSLog(@"setting---%@ %@", [NSThread currentThread], image);
            [self.button setImage:image forState:UIControlStateNormal];
        });
    });
}

 

-----------------------------------------------------------------------------------

 搜索activity

 一个进程(应用程序)至少有一个线程
线程Thread是串行的   如:一个一个下载任务顺序执行
 
默认情况主线程Thread 1M   子线程Thread 512k
 -----
---
 
如不能将下载文件的耗时操作放在主线程   会导致主线程这段时间不能刷新界面了
 
 ---
打印 [NSThread currentThread]
 num=1 一条线程  主线程
 
 ---
 ----
这个了解即可   NSThread开启线程
alloc init出来一个新线程
[NSThread isMainThread]
NSThread.name = "第2个线程";
 ------
新建多个线程 同时执行saleTicket  但是线程执行是切换的方式,所以执行顺序不一样,第一个线程可能最后一个执行,却发现票数少了2张     要加锁(互斥锁)   这样就不会造成数据操作延时引起的错误  
 ---
ios如何解决线程同步问题    线程同步==线程按照顺序执行  加锁是一种解决方案    加锁业务尽量交给服务器端执行   锁消耗大量cpu资源
 ---
atomic nonatomic      nonatomic是属性的setter方法里面没加锁   atomic加锁
---
 
 
 ---

 
 
等待主线程执行完毕 self.imageView.image = image后执行
 
子线程里  回到主线程(让主线程设置UI界面)   一般不需要等待主线程执行完毕
    // 4.回到主线程,刷新UI界面(为了线程安全)
    [self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];//不等主线程downLoad执行完毕  继续往下
//    [self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];//等主线程执行完毕downloadFinish才继续往下
//    [self.imageView performSelectorOnMainThread:@selector(setImageWithImage:) withObject:image waitUntilDone:NO];//等主线程执行完毕 才继续往下
NSThread exit] 强制退出线程  该线程清空 不能再次使用这个线程了
 
 ---
UI界面的属性用的是nonatomic 没有加锁的   在主线程中操作     不能用子线程来操作   防止主线程和子线程操作同一个属性
 
 --------------------------------------------------------
GCD
 
 --
 
 
 
 
 
------
并行队列开启多个线程的能力   dispatch_get_global_queue是并行队列 (0 是给未来用的 自动是0)
 
 
 
---------------
串行队列 一般只开一个新线程
 
这里只开一个新线程   因为虽然采用异步方式   但是还是添加到了  串行队列中    所以还是同步的
 
cpu同一时间只能处理一个Thread   "多线程"其实是多个线程快速切换  会消耗CPU内存资源     太多线程每个线程被切换的频率变低  IOS程序一般5条Thread
Thread设置优先级可以 获得切换次数更多一点 线程可以起名称 name属性
dispathch_queue_create("abc", DISPATCH_QUEUE_CONCURRENT);//创建一个并行队列
 
 --------------
dispatch_sync同步    只有一个线程    没有并发
 
 
 -------
任务放到主队列(串行队列 一般开一个新的线程)   异步的能力就失效了
 -------
 
 --------
 ----------------------
下载操作放在子线程里  或者   并行队列里(dispatch_get_global_queue)   子线程里下载好图片,
  然后将设置背景图片代码操作  放到主队列 串行队列里(等待被执行)
 
 ----
UI属性名称不能以new开通
--------
storyboard中的button要改为custom
 -----
为imageView添加手势识别器
 
 
   

 

 -------
这里不需要知道
 
 
posted @ 2016-03-14 19:23  海龙王来了  阅读(351)  评论(0)    收藏  举报
友情链接:废钢破碎机  带式压滤机