zoukankan      html  css  js  c++  java
  • 多线程的开发

    一.进程:

    进程是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的使用

     

     

  • 相关阅读:
    Final-阶段站立会议5
    Debug阶段成员贡献分
    每周例行报告——第九周
    beta发布简评
    简易四则运算生成程序——批量出题
    每周例行报告——第八周
    每周例行报告——第七周
    每周例行报告——第六周
    课堂作业:alpha发布点评
    “四则运算生成程序——GUI支持和部分功能改进”链接
  • 原文地址:https://www.cnblogs.com/lsh1234/p/6255245.html
Copyright © 2011-2022 走看看