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

2020-02-14  本文已影响0人  师大小海腾

iOS - 多线程 系列文章

iOS - 多线程(一):初识
iOS - 多线程(二):pthread、NSThread
iOS - 多线程(三):GCD
iOS - 多线程(四):NSOperation
iOS - 多线程(五):线程同步方案

网络配图.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 介绍

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 介绍

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

上一篇下一篇

猜你喜欢

热点阅读