iOS多线程实现2-NSThread
NSThread是轻量级的多线程开发,OC语言编写,更加面向对象,使用起来也并不复杂,但是使用NSThread需要自己管理线程生命周期,如果长期运行还要考虑内存释放的问题,比如自动释放池的创建于销毁。在iOS开发中很少使用它来创建一个线程,但是经常使用它做一些延时操作,获取当前线程,线程间通讯等等。
但是,在线程同步方面,控制线程执行顺序比较麻烦,线程同步对数据的加锁会有一定的系统开销,且创建线程也会增加系统的开销。
1 创建方法
有多种创建方法,- (void)runDemo:(NSString *)param;为要执行的示例方法。
- (void)runDemo:(NSString *)param {
NSThread *current = [NSThread currentThread];
NSLog(@"%@---%@ is running", param, current);
}
/// 方式1 自动创建线程, 并且自动启动
- (void)threadCreateOne {
// 在另一个线程执行 runDemo:
[self performSelectorInBackground:@selector(runDemo:) withObject:@"One"];
}
/// 方式2 创建完线程直接(自动)启动
- (void)threadCreateTwo {
[NSThread detachNewThreadSelector:@selector(runDemo:) toTarget:self withObject:@"Two"];
}
/// 方式3 先创建初始化线程,然后start开启线程
- (void)threadCreateThree {
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(runDemo:) object:@"Three"];
// 可以设置线程名字
thread.name = @"名字";
// 开启线程
[thread start];
}
下面为测试代码,以及打印结果,我们调用的顺序是One->Two->Three,但是打印结果是Two->Three->One,因为线程启动后仅仅处于就绪状态,实际是否执行要由CPU根据当前状态调度,即执行顺序是无序的,这也是多线程的特点。
/// 点击屏幕后创建线程
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self threadCreateOne];
[self threadCreateTwo];
[self threadCreateThree];
} 打印结果:
-- ::34.974 01test[:] Two---<NSThread: 0x7ff250e1c9a0>{number = , name = (null)} is running
-- ::34.974 01test[:] Three---<NSThread: 0x7ff250e168a0>{number = , name = 名字} is running
-- ::34.974 01test[:] One---<NSThread: 0x7ff250f406a0>{number = , name = (null)} is running
2 常用函数
获取当前线程,获取主线程,判断当前线程是否为主线程。
// 获取当前线程
NSThread *current = [NSThread currentThread];
// 获取主线程
current = [NSThread mainThread];
// 判断当前线程是否为主线程
BOOL isMain = [current isMainThread];
暂停线程,下面代码为2种方法均让当前线程睡5s
[NSThread sleepForTimeInterval:];
NSDate *date = [NSDate dateWithTimeInterval: sinceDate:[NSDate date]];
[NSThread sleepUntilDate:date];
获取线程的状态,分别为:正在执行、已经完成、已经取消。
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
@property (readonly, getter=isCancelled) BOOL cancelled;
在指定的线程(已存在的线程)、主线程、当前线程上执行方法。这种比较常用,通常用于线程间通讯,且它们是NSObject的扩展方法,使用起来很方便。
// 在指定的线程执行runDemo:方法,最后的YES代表:下面的代码会阻塞,等runDemo:方法在thread线程执行完毕后,才会执行下面代码的下一行代码,设为NO则不阻塞。那么runDemo:与下一行代码的执行顺序不确定
[self performSelector:@selector(runDemo:) onThread:thread withObject:nil waitUntilDone:YES];
// 在主线程执行runDemo:方法,YES参数同上
[self performSelectorOnMainThread:@selector(runDemo:) withObject:nil waitUntilDone:YES];
// 在当前线程执行方法
[self performSelector:@selector(run) withObject:nil];
退出线程:杀死线程,会阻碍线程内部自身的清理工作,所以最好让线程自己正常退出,而不是类似exit()这样的强制退出,(虽然很方便)
+ (void)exit;
线程优先级相关,优先级范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高。开发时,很少使用优先级,如果设置优先级且使用线程锁会造成优先级翻转,需要特备注意。
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
iOS多线程实现2-NSThread的更多相关文章
- iOS 多线程学习笔记 —— NSThread
本文复制.参考自文章:iOS多线程编程之NSThread的使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://blog.csdn.net/totogo ...
- iOS多线程编程之NSThread的使用
目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...
- iOS多线程编程之NSThread的使用(转)
本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation ...
- [转]iOS多线程编程之NSThread的使用
1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...
- iOS 多线程 简单学习NSThread NSOperation GCD
1:首先简单介绍什么叫线程 可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位. 共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K). 并发执行进度不可控,对非原子操作 ...
- iOS多线程编程之NSThread的使用(转载)
1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的 ...
- IOS 多线程02-pthread 、 NSThread 、GCD 、NSOperationQueue、NSRunLoop
注:本人是翻译过来,并且加上本人的一点见解. 要点: 1.前言 2.pthread 3.NSThread 4.Grand Central Dispatch(GCD) 5.Operation Queue ...
- iOS多线程开发之NSThread
一.NSThread基本概念 NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同 ...
- iOS多线程篇:NSThread简单介绍和使用
一.什么是NSThread NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程, 需要手动管理线程的生命周期,处理线程同 ...
- ios 多线程 面试
1 多线程是什么 同步完成多项任务,提高了资源的使用效率,从硬件.操作系统.应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色 ...
随机推荐
- ABZ理论
前言 身为著名的创业者+投资人,LinkedIn和Paypal的联合创始人Reid Hoffman有一个令我印象深刻的ABZ理论,他认为,你在任何时刻,手中都需要有三个计划:A计划.B计划和Z计划. ...
- 应用程序框架实战十三:DDD分层架构之我见
前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...
- Windows Server 2008 R2 WEB服务器配置系列文章索引
最近这段时间趁天翼云1元主机活动,购买了一个1元主机,主要是为了写一些服务器配置的教程. 已经完成如下几篇文章,送给大家. 国内云主机比较 天翼云/阿里云/腾讯云 Windows Server 200 ...
- boa + ajax + cgi ajax请求cgi
最近公司要做一个通讯管理机,然后需要和另外一个同事一起做,我们需要用到boa+Ajax+CGI,以前没试过与CGI交互,一开始发现问题挺大的,用ajax请求cgi,总是不返回数据,又或者请求回来的是c ...
- Shell脚本一枚
脚本如下: #!/bin/bash dir=$1 dir1="" for file in `find $dir -type f` do dir2=${file%/*} name=$ ...
- CSS兼容各浏览器的hack
CSS兼容各浏览器的hack:建议:尽可能的手写代码,可以有效的提高学习效率和深度.浏览器的种类多,麻烦自然也多,主要是各种浏览器对某些属性的渲染效果并不相同,所以有时候需要专门针对特定浏览器或者特定 ...
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...
- 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析
在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...
- 1Z0-053 争议题目解析481
1Z0-053 争议题目解析481 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 481.Which statement is true about a running sessi ...
- 遍历迭代map的集中方法
public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...