美文网首页
iOS多线程-创建线程

iOS多线程-创建线程

作者: 学习天亦 | 来源:发表于2019-06-02 22:26 被阅读0次

    复习下线程的基础知识, 这里主要是参考文顶顶多线程篇写的。

    一、创建和启动线程简单说明

    一个NSThread对象就代表一条线程

    1、创建线程

    方式一、创建、启动线程

     NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    [thread start];// 线程一启动,就会在线程thread中执行self的run方法
    

    方式二、创建线程后自动启动线程

    [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
    

    方式三、隐式创建并启动线程

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

    方式二和方式三创建线程方式的优缺点
    优点:简单快捷
    缺点:无法对线程进行更详细的设置

    2、主线程相关用法

    + (NSThread *)mainThread; // 获得主线程
    - (BOOL)isMainThread; // 是否为主线程
    + (BOOL)isMainThread; // 是否为主线程
    

    3、其他用法

    获得当前线程

    NSThread *current = [NSThread currentThread];
    

    线程的调度优先级:调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高

    + (double)threadPriority;
    + (BOOL)setThreadPriority:(double)p;
    

    设置线程的名字

    - (void)setName:(NSString *)n;
    - (NSString *)name;
    

    二、代码示例

    1、pthread

    void *run(void *data) {
        for (int i = 0; i < 10000; i++) {
            NSLog(@"touchesBegan----%d-----%@", i, [NSThread currentThread]);
        }
        return NULL;
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        // 创建线程
        pthread_t myRestrict;
        pthread_create(&myRestrict, NULL, run, NULL);
    }
    

    2、NSThread创建线程方式

    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        [self createThread1];
        [self createThread2];
        [self createThread3];
    }
    
    /**
     * 创建线程的方式1
     */
    - (void)createThread1 {
        // 创建线程
        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:@"http://a.png"];
        thread.name = @"下载线程";
        
        // 启动线程(调用self的download方法)
        [thread start];
    }
    
    
    /**
     * 创建线程的方式2
     */
    - (void)createThread2 {
        [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"http://b.jpg"];
    }
    
    /**
     * 创建线程的方式3
     */
    - (void)createThread3 {
        //这2个不会创建线程,在当前线程中执行
        //    [self performSelector:@selector(download:) withObject:@"http://c.gif"];
        //    [self download:@"http://c.gif"];
        
        [self performSelectorInBackground:@selector(download:) withObject:@"http://c.gif"];
    }
    
    - (void)download:(NSString *)url {
        NSLog(@"下载东西---%@---%@", url, [NSThread currentThread]);
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:iOS多线程-创建线程

          本文链接:https://www.haomeiwen.com/subject/tzpltctx.html