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:
1 //
2 // YYViewController.m
3 // 04-NSThread02-线程的状态
4 //
5 // Created by apple on 14-6-23.
6 // Copyright (c) 2014年 itcase. All rights reserved.
7 //
8
9 #import "YYViewController.h"
10
11 @interface YYViewController ()
12 @property(nonatomic,strong)NSThread *thread;
13
14 @end
15
16 @implementation YYViewController
17
18 - (void)viewDidLoad
19 {
20 [super viewDidLoad];
21
22 //创建线程
23 self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil];
24 //设置线程的名称
25 [self.thread setName:@"线程A"];
26 }
27 //当手指按下的时候,开启线程
28 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
29 {
30 //开启线程
31 [self.thread start];
32 }
33
34 -(void)test
35 {
36 //获取线程
37 NSThread *current=[NSThread currentThread];
38 NSLog(@"test---打印线程---%@",self.thread.name);
39 NSLog(@"test---线程开始---%@",current.name);
40
41 //设置线程阻塞1,阻塞2秒
42 NSLog(@"接下来,线程阻塞2秒");
43 [NSThread sleepForTimeInterval:2.0];
44
45 //第二种设置线程阻塞2,以当前时间为基准阻塞4秒
46 NSLog(@"接下来,线程阻塞4秒");
47 NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0];
48 [NSThread sleepUntilDate:date];
49 for (int i=0; i<20; i++) {
50 NSLog(@"线程--%d--%@",i,current.name);
51
52 }
53 NSLog(@"test---线程结束---%@",current.name);
54 }
55
56 @end
打印查看:
代码示例2(退出线程):
1 //
2 // YYViewController.m
3 // 04-NSThread02-线程的状态
4 //
5 // Created by apple on 14-6-23.
6 // Copyright (c) 2014年 itcase. All rights reserved.
7 //
8
9 #import "YYViewController.h"
10
11 @interface YYViewController ()
12 @property(nonatomic,strong)NSThread *thread;
13
14 @end
15
16 @implementation YYViewController
17
18 - (void)viewDidLoad
19 {
20 [super viewDidLoad];
21
22 //创建线程
23 self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil];
24 //设置线程的名称
25 [self.thread setName:@"线程A"];
26 }
27 //当手指按下的时候,开启线程
28 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
29 {
30 //开启线程
31 [self.thread start];
32 }
33
34 -(void)test
35 {
36 //获取线程
37 NSThread *current=[NSThread currentThread];
38 NSLog(@"test---打印线程---%@",self.thread.name);
39 NSLog(@"test---线程开始---%@",current.name);
40
41 //设置线程阻塞1,阻塞2秒
42 NSLog(@"接下来,线程阻塞2秒");
43 [NSThread sleepForTimeInterval:2.0];
44
45 //第二种设置线程阻塞2,以当前时间为基准阻塞4秒
46 NSLog(@"接下来,线程阻塞4秒");
47 NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0];
48 [NSThread sleepUntilDate:date];
49 for (int i=0; i<20; i++) {
50 NSLog(@"线程--%d--%@",i,current.name);
51 if (5==i) {
52 //结束线程
53 [NSThread exit];
54 }
55
56 }
57 NSLog(@"test---线程结束---%@",current.name);
58 }
59
60 @end
打印示例:
注意:人死不能复生,线程死了也不能复生(重新开启),如果在线程死亡之后,再次点击屏幕尝试重新开启线程,则程序会挂。
iOS多线程编程之线程的状态(转载)的更多相关文章
- iOS多线程编程:线程同步总结
1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一 ...
- iOS多线程编程之线程间的通信(转载)
一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 ...
- .NET面试题解析(07)-多线程编程与线程同步
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...
- iOS多线程编程指南
iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...
- iOS多线程编程原理及实践
摘要:iOS开发中,开发者不仅要做好iOS的内存管理,而且如果你的iOS涉及多线程,那你也必须了解iOS编程中对多线程的限制,iOS主线程的堆栈大小为1M,其它线程均为512KB,且这个限制开发者是无 ...
- Python中的多线程编程,线程安全与锁(一)
1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...
- C#多线程编程实例 线程与窗体交互
C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...
- vc 基于对话框多线程编程实例——线程之间的通信
vc基于对话框多线程编程实例——线程之间的通信 实例:
随机推荐
- Python中定义函数时参数有默认值的小陷阱
在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...
- 【调试错误】找不到 System.Web.Mvc 引用
今天调试新项目,从svn上clone下来,发现运行不了. System.Web.Mvc 显示黄色叹号 解决方案如下: 安装一个 MVC 的插件.AspNetMVC2_VS2008.exe 下载地址:h ...
- java基础---->java注解的使用(一)
注解是众多引入到Java SE5中的重要的语言变化之一.它为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据.今天我们就开始学习一下java中注解的知识. j ...
- es6 - class的学习
http://es6.ruanyifeng.com/#docs/class:class Person { constructor{ //构造函数,里边放不被继承的私有属性和方法 this.proper ...
- 电子邮件 -- 图解TCP_IP_第5版
图解TCP_IP_第5版 作者: [日]竹下隆史 / [日]村山公保 / [日]荒井透 / [日]苅田幸雄 出版社: 人民邮电出版社原作名: マスタリングTCP/IP 入門編 第5版译者: 乌尼日其其 ...
- javah生成jni头文件时报错 Error: cannot access android.support...
javah生成jni头文件时报错: Error: cannot access android.support.v7.app.AppCompatActivity class file for andro ...
- set数组去重
new Set const arr = [{name:"wo"},{name:"shi"},{name:"wo"}] console.log ...
- [转]redhat7(centos7) not registered to Red Hat Subscription Management
[root@controller0 ~]# yum install ntp Loaded plugins: fastestmirror, product-id, search-disabled-rep ...
- Mysql 忘记 root密码解决
1 stop mysql Ubuntu/Debian: sudo /etc/init.d/mysql stop CentOs: sudo /etc/init.d/mysqld stop 2 启动saf ...
- Ant的Manifest任务
建立一个清单文件,他将放入某个jar,作为jar文件的说明书.其中,在清单文件可以指定jar文件的main-class,jar文件将可以直接运行.例子: <manifest > < ...