04-了解-线程的状态
// ViewController.m // 04-了解-线程的状态 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; } - (void)run { for (NSInteger i = 0; i<100; i++) { NSLog(@"-----%zd", i); if (i == 49) { [NSThread exit]; // 直接退出线程 } } } - (void)run2 { NSLog(@"-------"); // [NSThread sleepForTimeInterval:2]; // 让线程睡眠2秒(阻塞2秒) // [NSThread sleepUntilDate:[NSDate distantFuture]]; [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]]; NSLog(@"-------"); } @end
05-掌握-线程安全
加锁-多个线程同时干一件事件会有问题;
// ViewController.m // 05-掌握-线程安全 #import "ViewController.h" @interface ViewController () /** 售票员01 */ @property (nonatomic, strong) NSThread *thread01; /** 售票员02 */ @property (nonatomic, strong) NSThread *thread02; /** 售票员03 */ @property (nonatomic, strong) NSThread *thread03; /** 票的总数 */ @property (nonatomic, assign) NSInteger ticketCount; /** 锁对象 */ //@property (nonatomic, strong) NSObject *locker; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // self.locker = [[NSObject alloc] init]; self.ticketCount = 100; //创建了3条线程;给每条线程去了名字; self.thread01 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil]; self.thread01.name = @"售票员01"; self.thread02 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil]; self.thread02.name = @"售票员02"; self.thread03 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil]; self.thread03.name = @"售票员03"; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.thread01 start]; [self.thread02 start]; [self.thread03 start]; } - (void)saleTicket { while (1) { @synchronized(self) {传一个锁的标识对象 // 先取出总数 NSInteger count = self.ticketCount; if (count > 0) { self.ticketCount = count - 1; NSLog(@"%@卖了一张票,还剩下%zd张", [NSThread currentThread].name, self.ticketCount); } else { NSLog(@"票已经卖完了"); break; } } } } @end
06-掌握-线程间通信-下载图片
// ViewController.m // 06-掌握-线程间通信-下载图片 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 另外一种线程之间的通信方式 // NSPort; // NSMessagePort; // NSMachPort; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//直接就是self调用了 [self performSelectorInBackground:@selector(download3) withObject:nil]; } - (void)download3 { // 图片的网络路径 NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"]; // 加载图片 NSData *data = [NSData dataWithContentsOfURL:url]; // 生成图片 UIImage *image = [UIImage imageWithData:data]; // 回到主线程,显示图片 [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO]; // [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; // [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES]; } //- (void)showImage:(UIImage *)image //{ // self.imageView.image = image; //} - (void)download2 { // 图片的网络路径 NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"]; CFTimeInterval begin = CFAbsoluteTimeGetCurrent(); // 根据图片的网络路径去下载图片数据 NSData *data = [NSData dataWithContentsOfURL:url]; CFTimeInterval end = CFAbsoluteTimeGetCurrent(); NSLog(@"%f", end - begin); // 显示图片 self.imageView.image = [UIImage imageWithData:data]; } - (void)download { // 图片的网络路径 NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"]; NSDate *begin = [NSDate date]; // 根据图片的网络路径去下载图片数据 NSData *data = [NSData dataWithContentsOfURL:url];
NSDate *end = [NSDate date]; NSLog(@"%f", [end timeIntervalSinceDate:begin]); // 显示图片 self.imageView.image = [UIImage imageWithData:data]; } @end