您的位置:首页 > 移动开发 > IOS开发

IOS多线程系统学习之线程的操作

2015-12-17 10:30 543 查看
线程的状态

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。即使线程开始运行以后,它也不可能一直“霸占”着CPU独自运行,所以CPU需要在多个线程 之间切换, 于是线程状态也会多次在运行,就绪状态之间切换。

当程序创建了一个线程之后,该线程就处于新建状态,此时它和其他Object-C对象一样,仅仅由系统为其分配了内存,并初始化了其成员变量的值。此时的线程对象也没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。

当线程对象调用了start方法之后,该线程处于就绪状态,系统会为其创建方法调用栈和程序计数器,处于这种状态中的线程并没有开始运行,它只是表示该线程可以运行了。至于该线程何时开始运行,取决于系统的调度。




终止子线程

线程会以一下三种方式之一结束,结束后就处于死亡状态。

1,线程执行体方法执行完成,线程正常结束。

2,线程执行过程中出现了错误。

3,直接调用NSThread类的exit方法来终止当前正在执行的线程。



为了测试某个线程是否正在运行,可以调用线程对象的isExecuting,isFinished方法,当线程正处于执行过程中时,调用isExcuting方法就会返回YES;当线程执行完成后,调用isFinished方法就会返回YES。

如果希望在UI线程线程中终止子线程,NSThread并没有提供方法来终止某个子线程,虽然NSThread提供了cancel方法,但该方法仅仅改变线程的状态,导致该线程的isCancelled方法返回为NO,而不是真正终止该线程。

为了在UI线程中终止子线程,可以向子线程发送一个信号(比如调用子线程的cancel方法),然后在子线程的线程执行体方法中进行判断。如果子线程收到过终止信号,程序应该调用NSThread类的exit方法来终止当前正在执行的循环。

演示代码如下:

NSThread* thread;
- (void)viewDidLoad
{
[super viewDidLoad];
// 创建新线程对象
thread = [[NSThread alloc] initWithTarget:self selector:@selector(run)
object:nil];
// 启动新线程
[thread start];
}
- (void)run
{
for(int i = 0 ; i < 100 ; i++)
{
if([NSThread currentThread].isCancelled)
{

NSLog(@"线程已经终止");
// 终止当前正在执行的线程
[NSThread exit];

}
NSLog(@"-----%@----%d" , [NSThread currentThread].name, i);
// 每执行一次,线程暂停0.5秒
[NSThread sleepForTimeInterval:0.5];
}
}
- (IBAction)cancelThread:(id)sender
{
// 取消thread线程,调用该方法后,thread的isCancelled方法将会返回NO
[thread cancel]; // ①
NSLog(@"按钮被触发");
}


运行结果如下:

2015-12-17 07:41:09.370 ThreadCancel[17871:3305376] ---------0
2015-12-17 07:41:09.876 ThreadCancel[17871:3305376] ---------1
2015-12-17 07:41:10.376 ThreadCancel[17871:3305376] ---------2
2015-12-17 07:41:10.880 ThreadCancel[17871:3305376] ---------3
2015-12-17 07:41:11.384 ThreadCancel[17871:3305376] ---------4
2015-12-17 07:41:11.476 ThreadCancel[17871:3305290] 按钮被触发
2015-12-17 07:41:11.887 ThreadCancel[17871:3305376] 线程已经终止


线程睡眠

如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可通过调用NSThread类的静态。 sleepXxx方法来完成。NSThread类提供了如下两个控制线程暂停的类方法。

1,
+(void)sleepUntilDate:(NSDate *)aDate:
让当前正在执行的线程暂停到aDate代表的时间,并进入阻塞状态。

2,
+(void)sleepForTimeInterval:(NSTimeInterval)ti:
让当前正在执行的线程暂停ti秒,并进入阻塞状态。

当当前线程调用sleepXxx方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于阻塞状态的线程也不会执行,因此sleepXxx方法常用来暂停线程的执行。

演示代码:

[NSThread sleepForTimeInterval:0.5];


用于控制当前正在执行的线程暂停0.5秒。

改变线程优先级

每个线程执行时都具有一定的优先级,优先级高的线程优先获得较多的执行机会,而优先级低的线程则获得较少的执行机会。每个线程默认的优先级为0.5。

NSThread 提供了如下实例方法和类方法来设置获取线程的优先级。

+threadPriority:
该类方法获取当前正在执行的 线程的优先级。

-threadPriority:
该实例方法获取调用该方法的线程对象的优先级。

+setThreadPriority:(double)priority:
该类方法用于设置当前正在执行的线程的优先级。

-setThreadPriority:(double)priority
该实例方法用于设置该方法的线程对象的优先级。

在上面方法中,setThreadPriority:(double)priority 方法的参数可以是 一个double类型的浮点数,范围为0.0~1.0 ,其中1.0代表最高优先级,0.0代表最低优先级。

演示代码:

- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"UI线程的优先级为:%g" , [NSThread threadPriority]);
// 创建第一个线程对象
NSThread* thread1 = [[NSThread alloc]
initWithTarget:self selector:@selector(run) object:nil];
// 设置第一个线程对象的名字
thread1.name = @"线程A";
NSLog(@"线程A的优先级为:%g" , thread1.threadPriority);
// 设置使用最低优先级
thread1.threadPriority = 0.0;
// 创建第二个线程对象
NSThread* thread2 = [[NSThread alloc]
initWithTarget:self selector:@selector(run) object:nil];
// 设置第二个线程对象的名字
thread2.name = @"线程B";
NSLog(@"线程B的优先级为:%g" , thread2.threadPriority);
// 设置使用最高优先级
thread2.threadPriority = 1.0;
// 启动2个线程
[thread1 start];
[thread2 start];
}
- (void)run
{
for(int i = 0 ; i < 100 ; i++)
{
NSLog(@"-----%@----%d" , [NSThread currentThread].name, i);
}
}


运行结果如下:

2015-12-17 10:31:07.160 PriorityTest[18084:3343387] UI线程的优先级为:0.5
2015-12-17 10:31:07.160 PriorityTest[18084:3343387] 线程A的优先级为:0.5
2015-12-17 10:31:07.160 PriorityTest[18084:3343387] 线程B的优先级为:0.5
2015-12-17 10:31:07.161 PriorityTest[18084:3343516] -----线程B----0
2015-12-17 10:31:07.161 PriorityTest[18084:3343516] -----线程B----1
2015-12-17 10:31:07.161 PriorityTest[18084:3343516] -----线程B----2
2015-12-17 10:31:07.161 PriorityTest[18084:3343516] -----线程B----3
2015-12-17 10:31:07.161 PriorityTest[18084:3343516] -----线程B----4
2015-12-17 10:31:07.161 PriorityTest[18084:3343516] -----线程B----5
2015-12-17 10:31:07.162 PriorityTest[18084:3343516] -----线程B----6
2015-12-17 10:31:07.162 PriorityTest[18084:3343516] -----线程B----7
2015-12-17 10:31:07.162 PriorityTest[18084:3343516] -----线程B----8
2015-12-17 10:31:07.163 PriorityTest[18084:3343516] -----线程B----9
2015-12-17 10:31:07.163 PriorityTest[18084:3343516] -----线程B----10
2015-12-17 10:31:07.163 PriorityTest[18084:3343516] -----线程B----11
2015-12-17 10:31:07.163 PriorityTest[18084:3343516] -----线程B----12
2015-12-17 10:31:07.164 PriorityTest[18084:3343516] -----线程B----13
2015-12-17 10:31:07.164 PriorityTest[18084:3343516] -----线程B----14
2015-12-17 10:31:07.166 PriorityTest[18084:3343516] -----线程B----15
2015-12-17 10:31:07.166 PriorityTest[18084:3343516] -----线程B----16
2015-12-17 10:31:07.166 PriorityTest[18084:3343516] -----线程B----17
2015-12-17 10:31:07.166 PriorityTest[18084:3343516] -----线程B----18
2015-12-17 10:31:07.166 PriorityTest[18084:3343516] -----线程B----19
2015-12-17 10:31:07.166 PriorityTest[18084:3343516] -----线程B----20
2015-12-17 10:31:07.166 PriorityTest[18084:3343516] -----线程B----21
2015-12-17 10:31:07.167 PriorityTest[18084:3343516] -----线程B----22
2015-12-17 10:31:07.168 PriorityTest[18084:3343516] -----线程B----23
2015-12-17 10:31:07.168 PriorityTest[18084:3343516] -----线程B----24
2015-12-17 10:31:07.168 PriorityTest[18084:3343516] -----线程B----25
2015-12-17 10:31:07.168 PriorityTest[18084:3343516] -----线程B----26
2015-12-17 10:31:07.168 PriorityTest[18084:3343516] -----线程B----27
2015-12-17 10:31:07.168 PriorityTest[18084:3343516] -----线程B----28
2015-12-17 10:31:07.169 PriorityTest[18084:3343516] -----线程B----29
2015-12-17 10:31:07.169 PriorityTest[18084:3343516] -----线程B----30
2015-12-17 10:31:07.169 PriorityTest[18084:3343516] -----线程B----31
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----32
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----33
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----34
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----35
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----36
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----37
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----38
2015-12-17 10:31:07.170 PriorityTest[18084:3343516] -----线程B----39
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----40
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----41
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----42
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----43
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----44
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----45
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----46
2015-12-17 10:31:07.171 PriorityTest[18084:3343516] -----线程B----47
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----48
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----49
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----50
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----51
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----52
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----53
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----54
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----55
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----56
2015-12-17 10:31:07.172 PriorityTest[18084:3343516] -----线程B----57
2015-12-17 10:31:07.173 PriorityTest[18084:3343516] -----线程B----58
2015-12-17 10:31:07.173 PriorityTest[18084:3343516] -----线程B----59
2015-12-17 10:31:07.173 PriorityTest[18084:3343516] -----线程B----60
2015-12-17 10:31:07.173 PriorityTest[18084:3343516] -----线程B----61
2015-12-17 10:31:07.173 PriorityTest[18084:3343516] -----线程B----62
2015-12-17 10:31:07.173 PriorityTest[18084:3343516] -----线程B----63
2015-12-17 10:31:07.173 PriorityTest[18084:3343516] -----线程B----64
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----65
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----66
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----67
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----68
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----69
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----70
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----71
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----72
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----73
2015-12-17 10:31:07.174 PriorityTest[18084:3343516] -----线程B----74
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----75
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----76
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----77
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----78
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----79
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----80
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----81
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----82
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----83
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----84
2015-12-17 10:31:07.175 PriorityTest[18084:3343516] -----线程B----85
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----86
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----87
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----88
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----89
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----90
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----91
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----92
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----93
2015-12-17 10:31:07.176 PriorityTest[18084:3343516] -----线程B----94
2015-12-17 10:31:07.177 PriorityTest[18084:3343515] -----线程A----0
2015-12-17 10:31:07.188 PriorityTest[18084:3343516] -----线程B----95
2015-12-17 10:31:07.192 PriorityTest[18084:3343516] -----线程B----96
2015-12-17 10:31:07.192 PriorityTest[18084:3343516] -----线程B----97
2015-12-17 10:31:07.192 PriorityTest[18084:3343516] -----线程B----98
2015-12-17 10:31:07.192 PriorityTest[18084:3343516] -----线程B----99
2015-12-17 10:31:07.193 PriorityTest[18084:3343515] -----线程A----1
2015-12-17 10:31:07.194 PriorityTest[18084:3343515] -----线程A----2
2015-12-17 10:31:07.194 PriorityTest[18084:3343515] -----线程A----3
2015-12-17 10:31:07.195 PriorityTest[18084:3343515] -----线程A----4
2015-12-17 10:31:07.195 PriorityTest[18084:3343515] -----线程A----5
2015-12-17 10:31:07.195 PriorityTest[18084:3343515] -----线程A----6
2015-12-17 10:31:07.195 PriorityTest[18084:3343515] -----线程A----7
2015-12-17 10:31:07.195 PriorityTest[18084:3343515] -----线程A----8
2015-12-17 10:31:07.196 PriorityTest[18084:3343515] -----线程A----9
2015-12-17 10:31:07.196 PriorityTest[18084:3343515] -----线程A----10
2015-12-17 10:31:07.196 PriorityTest[18084:3343515] -----线程A----11
2015-12-17 10:31:07.196 PriorityTest[18084:3343515] -----线程A----12
2015-12-17 10:31:07.197 PriorityTest[18084:3343515] -----线程A----13
2015-12-17 10:31:07.197 PriorityTest[18084:3343515] -----线程A----14
2015-12-17 10:31:07.198 PriorityTest[18084:3343515] -----线程A----15
2015-12-17 10:31:07.198 PriorityTest[18084:3343515] -----线程A----16
2015-12-17 10:31:07.198 PriorityTest[18084:3343515] -----线程A----17
2015-12-17 10:31:07.198 PriorityTest[18084:3343515] -----线程A----18
2015-12-17 10:31:07.199 PriorityTest[18084:3343515] -----线程A----19
2015-12-17 10:31:07.199 PriorityTest[18084:3343515] -----线程A----20
2015-12-17 10:31:07.199 PriorityTest[18084:3343515] -----线程A----21
2015-12-17 10:31:07.199 PriorityTest[18084:3343515] -----线程A----22
2015-12-17 10:31:07.200 PriorityTest[18084:3343515] -----线程A----23
2015-12-17 10:31:07.200 PriorityTest[18084:3343515] -----线程A----24
2015-12-17 10:31:07.200 PriorityTest[18084:3343515] -----线程A----25
2015-12-17 10:31:07.200 PriorityTest[18084:3343515] -----线程A----26
2015-12-17 10:31:07.201 PriorityTest[18084:3343515] -----线程A----27
2015-12-17 10:31:07.201 PriorityTest[18084:3343515] -----线程A----28
2015-12-17 10:31:07.201 PriorityTest[18084:3343515] -----线程A----29
2015-12-17 10:31:07.202 PriorityTest[18084:3343515] -----线程A----30
2015-12-17 10:31:07.202 PriorityTest[18084:3343515] -----线程A----31
2015-12-17 10:31:07.202 PriorityTest[18084:3343515] -----线程A----32
2015-12-17 10:31:07.202 PriorityTest[18084:3343515] -----线程A----33
2015-12-17 10:31:07.203 PriorityTest[18084:3343515] -----线程A----34
2015-12-17 10:31:07.203 PriorityTest[18084:3343515] -----线程A----35
2015-12-17 10:31:07.203 PriorityTest[18084:3343515] -----线程A----36
2015-12-17 10:31:07.203 PriorityTest[18084:3343515] -----线程A----37
2015-12-17 10:31:07.204 PriorityTest[18084:3343515] -----线程A----38
2015-12-17 10:31:07.204 PriorityTest[18084:3343515] -----线程A----39
2015-12-17 10:31:07.204 PriorityTest[18084:3343515] -----线程A----40
2015-12-17 10:31:07.205 PriorityTest[18084:3343515] -----线程A----41
2015-12-17 10:31:07.205 PriorityTest[18084:3343515] -----线程A----42
2015-12-17 10:31:07.205 PriorityTest[18084:3343515] -----线程A----43
2015-12-17 10:31:07.205 PriorityTest[18084:3343515] -----线程A----44
2015-12-17 10:31:07.206 PriorityTest[18084:3343515] -----线程A----45
2015-12-17 10:31:07.206 PriorityTest[18084:3343515] -----线程A----46
2015-12-17 10:31:07.206 PriorityTest[18084:3343515] -----线程A----47
2015-12-17 10:31:07.206 PriorityTest[18084:3343515] -----线程A----48
2015-12-17 10:31:07.207 PriorityTest[18084:3343515] -----线程A----49
2015-12-17 10:31:07.207 PriorityTest[18084:3343515] -----线程A----50
2015-12-17 10:31:07.207 PriorityTest[18084:3343515] -----线程A----51
2015-12-17 10:31:07.208 PriorityTest[18084:3343515] -----线程A----52
2015-12-17 10:31:07.208 PriorityTest[18084:3343515] -----线程A----53
2015-12-17 10:31:07.208 PriorityTest[18084:3343515] -----线程A----54
2015-12-17 10:31:07.208 PriorityTest[18084:3343515] -----线程A----55
2015-12-17 10:31:07.209 PriorityTest[18084:3343515] -----线程A----56
2015-12-17 10:31:07.209 PriorityTest[18084:3343515] -----线程A----57
2015-12-17 10:31:07.211 PriorityTest[18084:3343515] -----线程A----58
2015-12-17 10:31:07.213 PriorityTest[18084:3343515] -----线程A----59
2015-12-17 10:31:07.214 PriorityTest[18084:3343515] -----线程A----60
2015-12-17 10:31:07.214 PriorityTest[18084:3343515] -----线程A----61
2015-12-17 10:31:07.214 PriorityTest[18084:3343515] -----线程A----62
2015-12-17 10:31:07.214 PriorityTest[18084:3343515] -----线程A----63
2015-12-17 10:31:07.215 PriorityTest[18084:3343515] -----线程A----64
2015-12-17 10:31:07.215 PriorityTest[18084:3343515] -----线程A----65
2015-12-17 10:31:07.215 PriorityTest[18084:3343515] -----线程A----66
2015-12-17 10:31:07.215 PriorityTest[18084:3343515] -----线程A----67
2015-12-17 10:31:07.216 PriorityTest[18084:3343515] -----线程A----68
2015-12-17 10:31:07.216 PriorityTest[18084:3343515] -----线程A----69
2015-12-17 10:31:07.216 PriorityTest[18084:3343515] -----线程A----70
2015-12-17 10:31:07.218 PriorityTest[18084:3343515] -----线程A----71
2015-12-17 10:31:07.218 PriorityTest[18084:3343515] -----线程A----72
2015-12-17 10:31:07.220 PriorityTest[18084:3343515] -----线程A----73
2015-12-17 10:31:07.307 PriorityTest[18084:3343515] -----线程A----74
2015-12-17 10:31:07.308 PriorityTest[18084:3343515] -----线程A----75
2015-12-17 10:31:07.308 PriorityTest[18084:3343515] -----线程A----76
2015-12-17 10:31:07.309 PriorityTest[18084:3343515] -----线程A----77
2015-12-17 10:31:07.309 PriorityTest[18084:3343515] -----线程A----78
2015-12-17 10:31:07.309 PriorityTest[18084:3343515] -----线程A----79
2015-12-17 10:31:07.309 PriorityTest[18084:3343515] -----线程A----80
2015-12-17 10:31:07.310 PriorityTest[18084:3343515] -----线程A----81
2015-12-17 10:31:07.310 PriorityTest[18084:3343515] -----线程A----82
2015-12-17 10:31:07.310 PriorityTest[18084:3343515] -----线程A----83
2015-12-17 10:31:07.310 PriorityTest[18084:3343515] -----线程A----84
2015-12-17 10:31:07.310 PriorityTest[18084:3343515] -----线程A----85
2015-12-17 10:31:07.311 PriorityTest[18084:3343515] -----线程A----86
2015-12-17 10:31:07.311 PriorityTest[18084:3343515] -----线程A----87
2015-12-17 10:31:07.311 PriorityTest[18084:3343515] -----线程A----88
2015-12-17 10:31:07.315 PriorityTest[18084:3343515] -----线程A----89
2015-12-17 10:31:07.316 PriorityTest[18084:3343515] -----线程A----90
2015-12-17 10:31:07.319 PriorityTest[18084:3343515] -----线程A----91
2015-12-17 10:31:07.319 PriorityTest[18084:3343515] -----线程A----92
2015-12-17 10:31:07.321 PriorityTest[18084:3343515] -----线程A----93
2015-12-17 10:31:07.321 PriorityTest[18084:3343515] -----线程A----94
2015-12-17 10:31:07.322 PriorityTest[18084:3343515] -----线程A----95
2015-12-17 10:31:07.322 PriorityTest[18084:3343515] -----线程A----96
2015-12-17 10:31:07.322 PriorityTest[18084:3343515] -----线程A----97
2015-12-17 10:31:07.322 PriorityTest[18084:3343515] -----线程A----98
2015-12-17 10:31:07.323 PriorityTest[18084:3343515] -----线程A----99


可以看到UI线程的优先级为0.5,以后用到网络请求,需要多线程的时候,我们可以所用的线程优先级低于0.5就好了哦。这个很重要哦,用的好的话,用户体验会比较好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 多线程 线程