博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS 多线程 NSThread
阅读量:7123 次
发布时间:2019-06-28

本文共 1996 字,大约阅读时间需要 6 分钟。

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

  此外,在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];

 

作者:杰瑞教育
出处:
 
版权声明:本文版权归
技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:
 

转载于:https://www.cnblogs.com/jerehedu/p/4920709.html

你可能感兴趣的文章
大数据量的存储,以及分表常见算法及其带来的问题,和微薄url的加密规则猜想...
查看>>
js/jquery如何这样调用php?
查看>>
异常总结
查看>>
百思不得其解的Google缓存
查看>>
Android Studio无法预览xml layout的一个可能原因和解决办法
查看>>
写代码要注意的小细节
查看>>
ServletFileUpload使用方法
查看>>
JXL操作Excel
查看>>
2015年最受关注的8项IT技能
查看>>
github上的版本和本地版本冲突的解决方法
查看>>
apache和tomcat区别
查看>>
yii2有了一个js端的urlManager扩展了
查看>>
PHP命令行下的世界
查看>>
Docker多容器连接-以Nginx+PHP为例
查看>>
node.js http.serverResponse
查看>>
让我们聊聊脑裂这事情
查看>>
入侵检测 - AIDE高级入侵检测平台
查看>>
Getting unknown property: yii\db\ActiveQuery::name
查看>>
CentOS 6.5 双网卡配置一个上外网一个接局域网
查看>>
linux手动释放cached内存
查看>>