专栏首页iOS 技术分享iOS - 多线程(二):pthread、NSThread

iOS - 多线程(二):pthread、NSThread

网络配图.jpg

目录

  • 1. pthread  1.1 pthread 介绍  1.2 pthread 的简单使用
  • 2. NSThread  2.1 NSThread 介绍  2.2 NSThread 的基本使用  2.3 线程的状态、生命周期  2.4 线程池的原理  2.5 线程的属性
  • 相关链接

1. pthread

1.1 pthread 介绍

  • 全称 POSIX Thread,POSIX(Portable Operating System Interface)表示可移植操作系统接口;
  • 一套用 C 语言写的通用的多线程 API;
  • 适用于 Unix / Linux / Windows 等系统;
  • 跨平台/可移植;
  • 使用难度大、使用频率低;
  • 线程生命周期由程序员管理;
  • 现在 iOS 中用到 pthread 的多数情况是使用 pthread_mutex 互斥锁,性能较高。

1.2 pthread 的简单使用

#import <pthread.h>

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //创建子线程
    pthread_t pthread; //线程编号
    /*
     参数一:线程编号的地址
     参数二:线程的属性
     参数三:线程要执行的函数 void * (*)(void *)
     参数四:函数的参数,参数类型:void *
     返回值:0代表成功,非0代表失败
     pthread_create(pthread_t  _Nullable *restrict _Nonnull,
                    const pthread_attr_t *restrict _Nullable,
                    void * _Nullable (* _Nonnull)(void * _Nullable),
                    void *restrict _Nullable)
     */
    int result = pthread_create(&pthread, NULL, demo, NULL);
    if (result == 0) {
        NSLog(@"成功");
    } else {
        NSLog(@"失败");
    }
}

void *demo(void *param) {
    NSLog(@"hello,%@",[NSThread currentThread]);
    return NULL;
}

2. NSThread

2.1 NSThread 介绍

  • 使用更加面向对象;
  • 简单易用,可直接操作线程对象;
  • 语言 OC,线程生命周期由程序员管理,偶尔使用。

2.2 NSThread 的基本使用

方式一:需要手动调用 start 方法开启线程

    // SEL
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo) object:nil];
    [thread start];
    // block
    NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"hello,%@",[NSThread currentThread]);
    }];
    [thread start];

方式二:

    // SEL
    [NSThread detachNewThreadSelector:@selector(demo) toTarget:self withObject:nil];
    // block
    [NSThread detachNewThreadWithBlock:^{
        NSLog(@"hello,%@",[NSThread currentThread]);
    }];

方式三:

    // SEL
    [self performSelectorInBackground:@selector(demo) withObject:nil];

2.3 线程的状态、生命周期

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //新建状态
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo) object:nil];
    //就绪状态
    [thread start];  
}

- (void)demo {    
    //运行状态
    for (int i = 0; i < 20; i++) {
        NSLog(@"%d",i);
        if (i == 5) {
            //阻塞状态
            [NSThread sleepForTimeInterval:5];
        }        
        if (i == 10) {
            //线程退出,死亡状态
            [NSThread exit];
        }
    }
}

2.4 线程池的原理

参数名

代表含义

corePoolSize

线程池的基本大小(核心线程池大小)

maximumPoolSize

线程池的最大大小

keepAliveTime

线程池中超过 corePoolSize 数目的空闲线程的最大存活时间

unit

keepAliveTime 参数的时间单位

workQueue

任务阻塞队列

threadFactory

新建线程的工厂

handler

当提交的任务数超过 maximumPoolSize 与 workQueue 之和时,任务会交给 RejectedExecutionHandler 来处理

2.5 线程的属性

  • 线程名称: 设置线程名称可以当线程执行的方法内部出现的时候记录异常和当前线程。
  • 线程的优先级: 内核调度算法在决定该运行哪个线程时,会把线程的优先级作为考量因素,较高优先级的线程会比较低优先级的线程有更多的运行机会。较高优先级不保证你的线程具体执行的时间,不保证可以等它执行完再执行较低优先级的线程,只是比较低优先级的线程更有可能被调度器选择执行而已。
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo) object:nil];
    //线程名称
    thread.name = @"thread1";
    //线程优先级:范围 0.0-1.0,默认 0.5
    thread.threadPriority = 1.0;
    [thread start];

相关链接

GitHub:https://github.com/dolphin1208/Thread

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS - 多线程(一):初识

    安全+效率:因为 UIKit 框架不是线程安全的框架,当在多个线程进行 UI 操作,有可能出现资源抢夺,导致问题。

    师大小海腾
  • iOS - 多线程(四):NSOperation

    NSOperation 需要和 NSOperationQueue 配合使用来实现多线程方案。单独使用 NSOperation 的话, 它是属于同步操作, 并不具...

    师大小海腾
  • OC - load 和 initialize

    Person 以及它的两个分类 Person (Test)、Person (Test2) 都实现了+test和+load两个方法,且 Person (Test2...

    师大小海腾
  • Posix多线程编程

    线程存在于进程当中,是操作系统调度执行的最小单位。说通俗点线程就是干活,多线程也就是同时可以干不同的活而且还不会互相打扰,线程并没有自己的独立空间。

    morixinguan
  • iOS多线程——你要知道的NSThread都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

    你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 https://cloud.tencent.co...

    WWWWDotPNG
  • 干货分享:详解线程的开始和创建

    悟空聊架构
  • linux下进程和线程到底是什么?

    7537367
  • 技术干货| 腾讯云TDSQL多源同步架构与特性详解

    吴夏,腾讯云TDSQL研发工程师,目前主要负责日志解析复制、数据传输同步模块的开发工作。

    腾讯云数据库 TencentDB
  • 单例模式的六种花式写法

    单例模式是一种常用的设计模式,其定义是单例对象类只允许一个实例存在,实现的核心原理是构造函数私有化。使用单例可以节省内存开销,也是现实场景中的一种映射,比如一台...

    蜻蜓队长
  • 18 Python 基础: 重点知识点--进程和线程讲解

    本文首发于腾讯云+社区,也可关注微信公众号【离不开的网】支持一下,就差你的关注支持了。

    小Gy

扫码关注云+社区

领取腾讯云代金券