多线程的开发

一.进程:

进程是app应用程序 例如:酷狗

二.线程:

线程是app应用执行的任务 例如:下载音乐,播放音乐

  1. 串行是按顺序一个一个执行
  2. 多线程是一个进程有多个线程,这些线程可以同时执行不同任务

三.CPU:

        同一时间,CPU只能处理一条线程,多线程是cpu在不同线程之间调度.

注意:1.适当的多线程会提高cpu的利用率,内存利用率.

       2.线程太多,cpu会累死,消耗大量的cpu资源.线程被调度的频次会降低

       3.创建线程是有开销的,内核数据结构(大约1kb),栈空间(子线程512KB,主线程1MB,也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90ms的创建时间

       4.程序设计更加复杂:比如线程之间的通信、多线程的数据共享

多线程的实现
技术方案 简介 语言 生命周期 使用频率
pthread
  • 一套通用的多线程API
  • 适用于UnixLinuxWindows等系统
  • 跨平台可移植
  • 使用难度大
C 程序员管理 几乎不用
NSThread
  • 使用更加面向对象
  • 简单易用,可直接操作线程对象
OC 程序员管理 偶尔使用
GCD
  • 旨在替代NSThread等线程技术
  • 充分利用设备的多核
  • 多个单核CPU(每个线程一个CPU)和单个多核CPU(多个线程在一个CPU)
OC 自动管理 经常使用
NSOperation
  • 基于GCD(底层是GCD)
  • 比GCD多了一些更简单使用的功能
  • 使用更加面向对象

OC

自动管理 经常使用

pthread的使用

 //pthread 是属于 POSIX 多线程开发框架 (c语言多线程)

    NSString * str = @"hello Hank";

    pthread_t threadId;

//  - 在 ARC 开发中,如果涉及到和C语言中的相同的数据类型进行转换,需要使用 __bridge "桥接"

// - 在 MRC 不需要

    int result = pthread_create(&threadId, NULL, &demo, (__bridge  void *)(str));

// 返回值:  如果是0,标示正确.    如果非0,标示错误代码

       if (result == 0) {

        NSLog(@"OK");

        }

       else{

        NSLog(@"error %d",result);

        }

 

void * demo(void * param){

    NSLog(@"%@ %@",[NSThread currentThread],param);

    return NULL;

}

 

NSThread的使用

 1. //创建线程

        NSThread * t = [[NSThread alloc]initWithTarget:self selector:@selector(theadStatus) object:nil];

       t.name = @"Thread A"; //在大型的商业项目中,通常希望程序在崩溃的时候,能够获取到程序准确的所以在的线程!

 

       /**  优先级翻转

     优先级 只是保证 CPU 调度的可能性会高!

     多线程目的:将耗时操作放在后台,不阻塞UI线程!

     建议:在开发的时候,不要修改优先级, 在多线程开发中,不要相信一次的运行结果!!

     */

         t.threadPriority = 0.1;//优先级 从 0.0 -- 1.0  默认值 0.5

 

        [t start]; // 线程就绪(CPU翻牌)

        [t sleep];//sleep 方法是类方法,会直接休眠当前线程!!

        [NSThread exit];//exit 类方法,哥么终止当前线程!!!!

2.//创建线程

   //detach ==> 分离

    [NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"Detach"];

3.exit杀死线程,sleep线程休眠

          [self performSelectorInBackground:@selector(starMainThread) withObject:nil];

          [NSThread exit]; //注意!!! exit会杀掉主线程!但是APP不会挂掉!!

     -(void)starMainThread

     {

         [NSThread sleepForTimeInterval:1.0];

         [[NSThread mainThread] start];   //开启主线程!!

     }

 4.线程锁

 //互斥锁 -- 保证锁内的代码,同一时间,只有一条线程执行!

 //互斥锁 的范围 应该尽量小,范围大了 效率就差!!

            //1.判断是否有票

        //参数:任意OC对象都OK!一般用self!全局对象

        //局部变量,每一个线程单独拥有的,因此没法加锁!!!

一种NSCondition ,一种是:NSLock。 后期补上..。

GCD 使用

 

NSOperation的使用

 

 

原文地址:https://www.cnblogs.com/lsh1234/p/6255245.html