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

  此外,在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=; i<; i++) {
NSLog(@"参数为 %@, 当前的线程为 %@, 线程的名字为 %@",parm,currentThread,currentThread.name);
}
}

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

代码

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

(3)隐式方法开启线程

代码

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

暂停当前的线程

代码

//方法一
[NSThread sleepForTimeInterval:]; //方法二
NSDate *date = [NSDate dateWithTimeInterval: 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/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询:
 

IOS 多线程 NSThread的更多相关文章

  1. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  2. ios多线程NSThread

    1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...

  3. iOS多线程NSThread和GCD

    在iOS中啊  其实有多种方法实现多线程 这里只记录两个比较常用的  或者说我比较常用的 一个就是BSThread 另一个就是一听名字就比较霸气的妇孺皆知的GCD 先说一下NSThread吧 这个方式 ...

  4. iOS 多线程NSThread理解与场景示例

    NSThread是相对GCD和NSOperationQuene而言,比较轻量级的一种多线程处理方式. 但同时,它的弊端就是需要自己管理线程的生命周期,以及线程同步:而另外两种不需要自己管理. 常见方法 ...

  5. IOS 多线程-NSThread 和线程状态

    @interface HMViewController () - (IBAction)btnClick; @end @implementation HMViewController - (void)v ...

  6. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  7. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  8. iOS 多线程详解

    iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其 ...

  9. iOS多线程基本使用

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

随机推荐

  1. IBM MR10i阵列卡配置Raid0/Raid1/Raid5(转)

    RAID5配置: 其实RAID0/RAID1都基本一致,只是选择的类型不同. 1. 开机看到ctrl+h的提示按下相应的键,等ServerRaid 10-i卡初始化完成则进入WebBIOS 配置界面: ...

  2. Revit Family API 找到实体某一方向上的面。

    PlanarFace.Normal取得向量.IsAlmostEqualTo判断向量是否一致. // ================================================== ...

  3. WinForm MDIParent如何防止重复打开

    DI,全称是多文档界面(Multiple Document Interface),主要应用于基于图形用户界面的系统中.其目的是同时打开和显示多个文档,便于参考和编辑资料. 下面是一个WinForm M ...

  4. Visual Studio断点调试, 无法监视变量, 提示无法计算表达式

    在使用Visual Studio 2012进行断点调试时,对某个变量添加监视,出现"无法计算表达式"的提示. 解决办法:依次点击菜单栏中的"调试"→" ...

  5. delphiredisclient开源GIT

    delphiredisclient - Redis client for Delphi Delphi Redis Client版本2(此分支)与Delphi 10.1 Berlin兼容,更好.警告!如 ...

  6. java中Double类数字太大时页面正常显示而不要用科学计数法

    /** * 当浮点型数据位数超过10位之后,数据变成科学计数法显示.用此方法可以使其正常显示. * @param value * @return Sting */ public static Stri ...

  7. Git每次进入都需要输入用户名和密码的问题解决

    解决方法: 在项目目录下输入以下命令: git config --global credential.helper store 使用git pull 的时候回提示再输下用户名和密码就行了.

  8. TextView字体,行距,html格式,超链接,最大长度的设定

    颜色,大小 <!-- 设置字体的大小,推荐用sp做单位:字体颜色以#开头 --> <TextView android:id="@+id/textView1" an ...

  9. 关于 as 播放器的记录

    一:文件结构 1:代码 2:编译后   二:IDE展示区 1处还有6个层,2处为代码和设计文件,3处是主类. 资源文件的位置如下:   三:数据交互 AS中代码: JS中代码: 更多需要注意的地方在这 ...

  10. ECC校验

    ECC的全称是 Error Checking and Correction or Error correction Coding,是一种用于差错检测和修正的算法.NAND闪存在生产和使用中都会产生坏块 ...