大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行。改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作;对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续执行,用户同样可以继续进行其他UI操作,与此同时前一个操作的后续任务可以分散到多个空闲CPU中继续执行(当然具体调度顺序要根据程序设计而定),及解决了线程阻塞又提高了运行效率。苹果从iPad2 开始使用双核A5处理器(iPhone中从iPhone 4S开始使用),A7中还加入了协处理器,如何充分发挥这些处理器的性能确实值得思考。今天将重点分析iOS多线程开发:
一、简单介绍
线程的创建:
self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil];
说明:创建线程有多种方式,这里不做过多的介绍。
线程的开启:
[self.thread start];
线程的运行和阻塞:
(1)设置线程阻塞1,阻塞2秒
[NSThread sleepForTimeInterval:2.0];
(2)第二种设置线程阻塞2,以当前时间为基准阻塞4秒
NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0]; [NSThread sleepUntilDate:date];
线程处理阻塞状态时在内存中的表现情况:(线程被移出可调度线程池,此时不可调度)
线程的死亡:
当线程的任务结束,发生异常,或者是强制退出这三种情况会导致线程的死亡。
线程死亡后,线程对象从内存中移除。
二、代码示例
代码示例1:
// // YYViewController.m // -NSThread-线程的状态 // // Created by apple on --. // Copyright (c) 年 itcase. All rights reserved. // #import "YYViewController.h" @interface YYViewController () @property(nonatomic,strong)NSThread *thread; @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; //创建线程 self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; //设置线程的名称 [self.thread setName:@"线程A"]; } //当手指按下的时候,开启线程 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //开启线程 [self.thread start]; } -(void)test { //获取线程 NSThread *current=[NSThread currentThread]; NSLog(@"test---打印线程---%@",self.thread.name); NSLog(@"test---线程开始---%@",current.name); //设置线程阻塞,阻塞秒 NSLog(@"接下来,线程阻塞秒"); [NSThread sleepForTimeInterval:.]; //第二种设置线程阻塞,以当前时间为基准阻塞秒 NSLog(@"接下来,线程阻塞秒"); NSDate *date=[NSDate dateWithTimeIntervalSinceNow:.]; [NSThread sleepUntilDate:date]; for (int i=; i<; i++) { NSLog(@"线程--%d--%@",i,current.name); } NSLog(@"test---线程结束---%@",current.name); } @end
打印查看:
代码示例2(退出线程):
// // YYViewController.m // -NSThread-线程的状态 // // Created by apple on --. // Copyright (c) 年 itcase. All rights reserved. // #import "YYViewController.h" @interface YYViewController () @property(nonatomic,strong)NSThread *thread; @end @implementation YYViewController - (void)viewDidLoad { [super viewDidLoad]; //创建线程 self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; //设置线程的名称 [self.thread setName:@"线程A"]; } //当手指按下的时候,开启线程 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //开启线程 [self.thread start]; } -(void)test { //获取线程 NSThread *current=[NSThread currentThread]; NSLog(@"test---打印线程---%@",self.thread.name); NSLog(@"test---线程开始---%@",current.name); //设置线程阻塞,阻塞秒 NSLog(@"接下来,线程阻塞秒"); [NSThread sleepForTimeInterval:.]; //第二种设置线程阻塞,以当前时间为基准阻塞秒 NSLog(@"接下来,线程阻塞秒"); NSDate *date=[NSDate dateWithTimeIntervalSinceNow:.]; [NSThread sleepUntilDate:date]; for (int i=; i<; i++) { NSLog(@"线程--%d--%@",i,current.name); if (==i) { //结束线程 [NSThread exit]; } } NSLog(@"test---线程结束---%@",current.name); } @end
打印示例:
注意:人死不能复生,线程死了也不能复生(重新开启),如果在线程死亡之后,再次点击屏幕尝试重新开启线程,则程序会挂。
以上内容是小编给大家介绍的IOS多线程开发之线程的状态 ,希望大家喜欢。
本文向大家介绍iOS多线程开发——NSThread浅析,包括了iOS多线程开发——NSThread浅析的使用技巧和注意事项,需要的朋友参考一下 在iOS开发中,多线程的实现方式主要有三种,NSThread、NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用。案例代码上传至 http
> 我是Java多线程的新手。想知道线程池执行器中空闲线程的状态。它在RUNNABLE/WAITING中吗? 如果空闲线程处于RUNNABLE状态,新任务如何附加到空闲线程?AFAIK我们为线程/池分配一个可运行/可调用的对象。但我的问题是ThreadPoolExecitor如何将排队的可运行对象分配给空闲线程??
本文向大家介绍理解iOS多线程应用的开发以及线程的创建方法,包括了理解iOS多线程应用的开发以及线程的创建方法的使用技巧和注意事项,需要的朋友参考一下 一、进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ、Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程
本文向大家介绍IOS开发-多线程队列测试代码,包括了IOS开发-多线程队列测试代码的使用技巧和注意事项,需要的朋友参考一下 直接贴测试代码了。 当前考虑的问题: 1.队列有多少个消费者 2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞) 3.多个队列之间的调度(此文章未涉及)
本文向大家介绍iOS多线程介绍,包括了iOS多线程介绍的使用技巧和注意事项,需要的朋友参考一下 一、前言部分 最近在面试,重新温习了一遍多线程,希望加深一遍对于多线程的理解。 1、什么是进程? 1).要了解线程我们必须先了解进程,通俗来讲进程就是在系统中运行的一个应用程序。 2).每个线程之间是独立存在的,分别运行在其专用的且受保护的内存空间中。 3).比如打开QQ或Xcode系统会分别开启两个进
多线程编程Demo,包括 GCD 的使用,block 的使用,NSThread 的使用,异步下载,同步下载等。 [Code4App.com]