zoukankan      html  css  js  c++  java
  • IOS 多线程 NSThread

      一个正在运行的应用程序是一个进程,一个进程会默认开启一个主线程,但是在主线程中的操作是串行的,也就是当有多个任务同时需要完成的时候,是按照顺序一个个执行。因此,为了提高效率,会在进程中开启多个线程,每个线程可以并行的执行不同的任务。

      此外,在ios程序中,处理用户触摸事件、刷新界面等操作是必须放到主线程中实现的,因此那些比较耗费资源的,比如从网络获取数据、下载等操作可以放到子线程中,不然的话,很容易造成主线程阻塞,一旦主线程阻塞,就会出现卡顿的现象,影响用户体验。

      在ios中,使用多线程有三种方式,分别是:

    (1)NSThread

      NSThread是一种比较原始的使用线程的方式,它是轻量级的方式,与其他方式相比,能更直观的控制线程对象。但是通过这种方式,需要管理线程的生命周期,如果想实现同步,还需要加锁,会加大系统开销。

    (2)NSOperation和NSOperationQueue

    NSOperation以面向对象的方法封装了需要执行的操作,然后将这个操作放到一个NSOperationQueue中异步执行,不需要去管理线程与处理同步的问题。

    (3)Grand Centeral Dispatch

    简称GCD,是c语言的API。GCD中提供了一些新特性来实现设备多核的并行编程。

    在本篇文章,我们先来讲解一下NSThread的使用。

    NSThread

    NSThread是线程类,一个NSThread实例就代表是一个线程。

    获取主线程

    代码

    NSThread *mainThread = [NSThread mainThread];

    获取当前线程

    代码

    NSThread *currentThread = [NSThread currentThread];

    NSThread创建

    (1)动态方法:通过对象方法来创建线程,需要手动开启线程  

    代码

    //初始化线程
    NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(startThread:) object: @"ios"];
    thread1.name = @"thread1";
    //开启线程
    [thread1 start];

    通过开启线程调用的方法

    代码

    -(void)startThread:(NSString *)parm{
        
        NSThread *currentThread = [NSThread currentThread];
        
        for (int i=0; i<10; i++) {
            NSLog(@"参数为 %@, 当前的线程为 %@, 线程的名字为 %@",parm,currentThread,currentThread.name);
        }
    }

    (2)静态方法:通过类方法开启线程,系统自动调用

    代码

    [NSThread detachNewThreadSelector:@selector(startThread:) toTarget:self withObject:@"jredu"];

    (3)隐式方法开启线程

    代码

    [self performSelectorInBackground:@selector(startThread:) withObject:@"apple"];

    暂停当前的线程

    代码

    //方法一
    [NSThread sleepForTimeInterval:2];
     
    //方法二
    NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
    [NSThread sleepUntilDate:date];

    在某个线程上执行操作

    (1)在指定线程执行操作

    代码

    [self performSelector:@selector(run) onThread:thread1 withObject:nil waitUntilDone:YES];

    (2)在主线程执行操作

    代码

    [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];  

    (3)在当前线程执行操作

    代码

    [self performSelector:@selector(run) withObject:nil]; 
    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    技术咨询:JRedu技术交流
     
  • 相关阅读:
    解决ORA-00257: 归档程序错误。在释放之前仅限于内部连接
    linux 监控脚本运行时间
    sqlserver中查询表字段的sql语句
    gpg无法生成密钥对的问题
    jdbc连接oracle的几种格式
    windows中使用tracert命令追踪路由信息
    MySQL编码问题探究
    Apache Storm Installation
    linux的swap相关
    awk
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4920709.html
Copyright © 2011-2022 走看看