zoukankan      html  css  js  c++  java
  • IOS 多线程之 NSThread

    线程概述

    有些程序是一条直线,起点到终点——如简单的hello world,运行打印完,它的生命周期便结束了,像是昙花一现。

    有些程序是一个圆,不断循环直到将它切断——如操作系统,一直运行直到你关机。

    一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。

    Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程。主线成在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的操作必须在主线程进行。

    系统中每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则公用进程的内存空间。

    1.什么是进程?

    进程:最直观的就是一个个pid,进程是程序在计算机上的一次执行活动。从main函数开始到main函数的return结束!

    (由此可见:大部分的app都只有一个main函数,也就是单进程应用!!!)

    2.什么是线程?

    一个进程中至少有一个线程(主线程),创建一个新的线程就是给进程增加一个执行流,(就像一条河流,在主干道向多出一个分流这样主干道的任务量就减少了!!)

    3.为什么要用多线程有什么好处?

    在一些任务量比较大的情况下,主线程中处理需要花费比较多得时间(这样UI界面会很不流畅)可以开启子线程 让这些任务有子线程在后台来处理,处理完了回到主线程中更新UI 就可以了

    iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验。一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程堵塞

    (举个例子:一个坐汽车的工厂,他需要的各种配件,自己坐起来耗费时间周期比较长,这样就直接让其他的配件公司去做,它只用等做好了用就可以了)

    4.多线程应用场景。

    异步请求,下载图片,如果执行一项任务需要多个步骤,每一步都需要等待上一步的结果,这样就处理起来很耗时可以同时开启多个线程 让每一步在一个线程中执行  这样可以减少等待的时间等等!!!

    下面介绍NSThread iOS开发中的应用

    1.创建一个线程

    //实例方法创建一个线程  ---- 需要手动的开始执行线程
        NSThread * thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(firstThread:) object:nil];
        // 设置线程的优先级(0.0 ~ 1.0,1.0是最高级)
        thread1.threadPriority = 0.7;
        // 开启线程
        [thread1 start];
    
    -(void)firstThread:(NSThread *)sender
    {
        NSLog(@"firstThread");
    }
    // 调用完毕后,会马上创建并开启新线程----静态创建
        [NSThread detachNewThreadSelector:@selector(secondThread:) toTarget:self withObject:nil];
    
    
    
    -(void)secondThread:(NSThread *)sender
    {
        NSLog(@"secondThread");
    }
    //隐式创建一个线程
        [self performSelectorInBackground:@selector(thirdThread:) withObject:nil];
    
    -(void)thirdThread:(NSThread *)sender
    {
        NSLog(@"thirdThread");
    }

    2.获取主线程和当前正在执行任务的线程

    //获取主线程
        NSThread *mainThread = [NSThread mainThread];
    //获取当前正在执行任务的线程
        NSThread *currentThread = [NSThread currentThread];

    3.让线程停止几秒钟后在执行

    //获取当前正在执行任务的线程
        NSThread *currentThread = [NSThread currentThread];
        //让当前执行任务的线程  停止2s后在继续执行   注意非必要的情况下不允许让主线程停止,不然界面会被卡住
        [NSThread sleepForTimeInterval:2];
        /*
        NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
        [NSThread sleepUntilDate:date];
        */

    4.线程间的跳转执行

     //回主线程
    [self performSelectorOnMainThread:@selector(runOnMainThread) withObject:nil waitUntilDone:YES];
    
    
    //回到当前线程中去执行相应的任务
     [self performSelector:@selector(run) withObject:nil];
        
    
    //回到指定的线程中去执行相应的任务
    [self performSelector:@selector(run) onThread:oneThread withObject:nil waitUntilDone:YES];

    5.NSThread 和NSOperationQueue  GCD 相比之下的优缺点

    优点:NSThread 比其他两个轻量级

    缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

    文章到此就结束啦,希望对路过的朋友有所帮助!!!

  • 相关阅读:
    jquery validate --转载
    领域驱动设计之领域模型--转载
    为system对象添加扩展方法
    DDD开源框架
    浅谈命令查询职责分离(CQRS)模式---转载
    AutoMapper小结
    执行后台任务的利器——Hangfire
    单元测试框架
    内存中的堆和栈
    ++*p,(*p)++,*p++与*++p四者的区别
  • 原文地址:https://www.cnblogs.com/Mgs1991/p/5137465.html
Copyright © 2011-2022 走看看