iOS 多线程篇6—线程的状态
2016-05-30 18:57
459 查看
一、简单介绍
1. 线程的创建:
self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil];
说明:创建线程有多种方式,这里不做过多的介绍。
![](http://images.cnitblog.com/i/450136/201406/242256335021175.png)
2. 线程的开启:
[self.thread start];![](http://images.cnitblog.com/i/450136/201406/242259355491524.png)
3. 线程的运行和阻塞:
(1)设置线程阻塞1,阻塞2秒[NSThread sleepForTimeInterval:2.0];
(2)第二种设置线程阻塞2,以当前时间为基准阻塞4秒
NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0]; [NSThread sleepUntilDate:date];
线程处理阻塞状态时在内存中的表现情况:(线程被移出可调度线程池,此时不可调度)
![](http://images.cnitblog.com/i/450136/201406/242303053149907.png)
4.线程的死亡:
当线程的任务结束,发生异常,或者是强制退出这三种情况会导致线程的死亡。![](http://images.cnitblog.com/i/450136/201406/242304408926607.png)
线程死亡后,线程对象从内存中移除。
![](http://images.cnitblog.com/i/450136/201406/242306237525299.png)
二、代码示例
代码示例1:// // YYViewController.m // 04-NSThread02-线程的状态 // // Created by apple on 14-6-23. // Copyright (c) 2014年 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); //设置线程阻塞1,阻塞2秒 NSLog(@"接下来,线程阻塞2秒"); [NSThread sleepForTimeInterval:2.0]; //第二种设置线程阻塞2,以当前时间为基准阻塞4秒 NSLog(@"接下来,线程阻塞4秒"); NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0]; [NSThread sleepUntilDate:date]; for (int i=0; i<20; i++) { NSLog(@"线程--%d--%@",i,current.name); } NSLog(@"test---线程结束---%@",current.name); } @end
打印查看:
![](http://images.cnitblog.com/i/450136/201406/242333415171545.png)
代码示例2(退出线程):
// // YYViewController.m // 04-NSThread02-线程的状态 // // Created by apple on 14-6-23. // Copyright (c) 2014年 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); //设置线程阻塞1,阻塞2秒 NSLog(@"接下来,线程阻塞2秒"); [NSThread sleepForTimeInterval:2.0]; //第二种设置线程阻塞2,以当前时间为基准阻塞4秒 NSLog(@"接下来,线程阻塞4秒"); NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0]; [NSThread sleepUntilDate:date]; for (int i=0; i<20; i++) { NSLog(@"线程--%d--%@",i,current.name); if (5==i) { //结束线程 [NSThread exit]; } } NSLog(@"test---线程结束---%@",current.name); } @end
打印示例:
![](http://images.cnitblog.com/i/450136/201406/242336055496581.png)
注意:人死不能复生,线程死了也不能复生(重新开启),如果在线程死亡之后,再次点击屏幕尝试重新开启线程,则程序会挂。
![](http://images.cnitblog.com/i/450136/201406/242337493146714.png)
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题