ios开发多线程篇——线程的状态

来源:互联网 发布:淘宝男装冬装 编辑:程序博客网 时间:2024/05/16 23:58

一.简单介绍
线程的创建:
self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil];
说明:创建线程有多种方式,这里不做过多的介绍。
这里写图片描述
线程的开启:
[self.thread start];
这里写图片描述
线程的运行和阻塞:
(1)第一种设置线程阻塞,阻塞2秒
[NSThread sleepForTimeInterval:2.0];
(2)第二种设置线程阻塞,以当前时间为基准阻塞4秒
NSDate *date=[NSDate dateWithTimeIntervalSinceNow:4.0];
[NSThread sleepUntilDate:date];
这里写图片描述
线程的死亡:
当线程的任务结束,发生异常,或者是强制退出这三种情况会导致线程的死亡。
这里写图片描述
线程死亡后,线程对象从内存中移除。
这里写图片描述

二.代码示例
示例1

#import "ViewController.h"@interface ViewController ()@property(nonatomic,strong) NSThread *thread;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    //创建线程    self.thread = [[NSThread alloc] initWithTarget:self                                          selector:@selector(test)                                            object:nil];    //设置线程的名字    self.thread.name = @"线程A";}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //开启线程    [self.thread start];}- (void)test{    //获取线程    NSThread *current = [NSThread currentThread];    NSLog(@"test---打印线程---%@",self.thread.name);    NSLog(@"test---线程开始---%@",current.name);    //第一种设置线程阻塞,阻塞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

示例2(退出线程)

#import "ViewController.h"@interface ViewController ()@property(nonatomic,strong) NSThread *thread;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    //创建线程    self.thread = [[NSThread alloc] initWithTarget:self                                          selector:@selector(test)                                            object:nil];    //设置线程的名字    self.thread.name = @"线程A";}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //开启线程    [self.thread start];}- (void)test{    //获取线程    NSThread *current = [NSThread currentThread];    NSLog(@"test---打印线程---%@",self.thread.name);    NSLog(@"test---线程开始---%@",current.name);    //第一种设置线程阻塞,阻塞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 (i == 5) {            //结束线程            [NSThread exit];        }    }    NSLog(@"test---线程结束---%@",current.name);}@end

注意:人死不能复生,线程死了也不能复生(重新开启),如果在线程死亡之后,再次点击屏幕尝试重新开启线程,则程序会挂。

0 0
原创粉丝点击