iOS UI-线程(NSThread)及其安全隐患

一、基本使用

  1 //
  2 //  ViewController.m
  3 //  IOS_0116_NSThread
  4 //
  5 //  Created by ma c on 16/1/16.
  6 //  Copyright (c) 2016年 博文科技. All rights reserved.
  7 //
  8
  9 #import "ViewController.h"
 10 #import <pthread.h>
 11
 12 /*
 13  线程的实现方案
 14  pthread
 15  NSThread
 16  GCD
 17  NSOperation
 18  */
 19 @interface ViewController ()
 20
 21 @end
 22
 23 @implementation ViewController
 24
 25
 26 - (void)viewDidLoad {
 27     [super viewDidLoad];
 28
 29     //[self pthread];
 30
 31 }
 32 #pragma mark - 创建线程NSThread
 33 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 34 {
 35 //    [self createThread1];
 36 //    [self createThread2];
 37     [self createThread3];
 38
 39 }
 40 #pragma mark - 创建线程3
 41 - (void)createThread3
 42 {
 43     //隐式创建线程
 44     [self performSelector:@selector(download:) withObject:@"http:www.bowen.cn"];
 45     [self download:@"http:www.bowen.cn"];
 46
 47     [self performSelectorInBackground:@selector(download:) withObject:@"http:www.bowen.cn"];
 48
 49     [self performSelector:@selector(download:) onThread:[NSThread mainThread] withObject:@"http:www.bowen.cn" waitUntilDone:nil];
 50
 51 }
 52
 53
 54 #pragma mark - 创建线程2
 55 - (void)createThread2
 56 {
 57     //创建后并启动线程
 58     [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"http:www.bowen.cn"];
 59 }
 60 - (void)download:(NSString *)url
 61 {
 62     NSLog(@"\ndownload----%@",[NSThread mainThread]);
 63
 64
 65     NSLog(@"\ndownload----%@----%@",url,[NSThread currentThread]);
 66 }
 67
 68 #pragma mark - 创建线程1
 69 //启动线程 - 进入就绪状态 -(CPU调度当前线程)- 运行状态 - 线程任务完毕,自动进入死亡状态
 70 //                                               -调用sleep方法或者等待同步锁 - 阻塞状态
 71 - (void)createThread1
 72 {
 73     //创建线程
 74     NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download) object:nil];
 75     //设置线程的名字
 76     thread.name = @"下载线程";
 77     //当前线程是否是主线程
 78     [thread isMainThread];
 79     //启动线程
 80     [thread start];
 81
 82     //判断当前方法是否是在主线程主线程中执行
 83     [NSThread isMainThread];
 84 }
 85
 86 - (void)download
 87 {
 88     NSLog(@"\ndownload----%@",[NSThread mainThread]);
 89
 90     //阻塞线程
 91     [NSThread sleepForTimeInterval:3];
 92     [NSThread  sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
 93
 94     NSLog(@"\ndownload----%@",[NSThread currentThread]);
 95
 96     //强制停止线程
 97     [NSThread exit];
 98     NSLog(@"\ndownload----%@",@"exit");
 99 }
100
101
102 #pragma mark - pthread
103 - (void)pthread
104 {
105     NSLog(@"\nviewDidLoad-------%@",[NSThread currentThread]);
106
107     //创建线程
108     pthread_t myRestrict;
109     pthread_create(&myRestrict, NULL, run, NULL);
110 }
111
112 void *run(void *data)
113 {
114     NSLog(@"\nrun-------%@",[NSThread currentThread]);
115
116     return NULL;
117 }
118
119 @end

二、线程安全

 1 //
 2 //  ViewController.m
 3 //  IOS_0117_线程的安全隐患
 4 //
 5 //  Created by ma c on 16/1/17.
 6 //  Copyright (c) 2016年 博文科技. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10
11 @interface ViewController ()
12
13 @property (nonatomic, strong) NSThread *thread1;
14 @property (nonatomic, strong) NSThread *thread2;
15
16 //剩余票数
17 @property (nonatomic, assign) int leftTicketCount;
18
19 @end
20
21 @implementation ViewController
22 /*
23  资源共享
24  一块资源可能会被多个线程共享,也就是多个线程可能会访问[同一块资源]
25
26  比如多个线程访问同一个对象、同一个变量、同一个文件
27
28  当多个线程访问同一块资源时,很容易引发[数据错乱和数据安全]问题
29
30  */
31
32 - (void)viewDidLoad {
33     [super viewDidLoad];
34
35     self.leftTicketCount = 50;
36
37     self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
38     self.thread1.name = @"1号窗口";
39     self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
40     self.thread2.name = @"2号窗口";
41
42
43 }
44
45 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
46 {
47     [self.thread1 start];
48     [self.thread2 start];
49 }
50 /*
51  互斥锁使用格式
52  @synchronized(锁对象) { // 需要锁定的代码  }
53  注意:锁定1份代码只用1把锁,用多把锁是无效的
54
55  互斥锁的优缺点
56  优点:能有效防止因多线程抢夺资源造成的数据安全问题
57  缺点:需要消耗大量的CPU资源
58
59  互斥锁的使用前提:多条线程抢夺同一块资源
60
61  相关专业术语:线程同步
62  线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
63  互斥锁,就是使用了线程同步技术
64
65  */
66 - (void)saleTicket
67 {
68     while (1) {
69
70         @synchronized(self){ //开始枷锁 小括号里面放的是锁对象
71             int count = self.leftTicketCount;
72             if (count>0) {
73                 self.leftTicketCount = count -1;
74                 NSLog(@"%@卖了一张票,剩余%d张票",[NSThread currentThread].name, self.leftTicketCount);
75             }else{
76                 return; //退出循环 break
77             }
78
79         }//解锁
80
81     }
82 }
83
84 - (void)didReceiveMemoryWarning {
85     [super didReceiveMemoryWarning];
86     // Dispose of any resources that can be recreated.
87 }
88
89 @end

三、线程间通信

时间: 2024-11-02 02:20:38

iOS UI-线程(NSThread)及其安全隐患的相关文章

IOS UI多线程 NSThread 下载并显示图片到UIImageView

效果图 @property (weak,nonatomic)IBOutletUILabel *downLabelInfo; @property (weak,nonatomic)IBOutletUIImageView *imageView; @end @implementationViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *url  [email protected]"http://d.hiphotos.b

IOS UI 线程与非 UI 线程代码收集

直接分出到子线程中 [NSThread detachNewThreadSelector:@selector(setupImageResampling) toTarget:self withObject:nil]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{        [NSThread sleepForTimeInterval:.5f];                while (

iOS UI异步更新:dispatch_async 与 dispatch_get_global_queue 的使用方法

GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开始支持GCD. 使用GCD的一个理由就是方便.回想一下以前的多线程编程,我们会把异步调用的代码放到另外的一个函数中,并通过NSThread开启新线程来启动这段代码. 这种跳来跳去的流程对于复杂的逻辑简直就是一场灾难.更糟糕的是,调用线程时的环境对异步代码是不可见的,如果我们需要当时的临时变量的话只有

iOS多线程-NSThread

本文转载自嘟嘟夜未央的博文:http://www.cnblogs.com/huluo666/p/3645889.html,修改了部分代码和贴图,如有侵犯版权请与我联系删除. 多线程这个概念的接触是蛮早的时候了,当时还是单核单CPU的时候,Thread这个概念已经出现了,当时比较流行的方案是时间片轮流,线程可以优先级抢占,但一次只能运行一个线程,实际上多线程是不能真正并行处理的,只是宏观上表现的多线程在齐头并进.现在硬件进步了很多,多核的CPU时代来临了,于是线程开始了真正意义上的并行处理,多线程

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

转载的一篇关于iOS里多线程NSThread/NSOperation/GCD的文章

转载 IOS多线程编程对于初学者来说,总是会觉得很难理解和掌握,现在通过几个实例来更加系统全面的理解IOS多线程编程,希望对大家有所帮助. 1:首先简单介绍什么叫线程可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位.共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K).并发执行进度不可控,对非原子操作易造成状态不一致,加锁控制又有死锁的风险. 2:IOS中的线程iOS主线程(UI线程),我们的大部分业务逻辑代码运行于主线程中.没有特殊需求,不应引入线程增加程序复杂

iOS开发 - 线程与进程的认识与理解

进程: 进程是指在系统中正在运行的一个应用程序,比如同时打开微信和Xcode,系统会分别启动2个进程; 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内; 线程: 一个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程),是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位; 一个进程(程序)的所有任务都在线程中执行; 一个程序有且只有一个主线程,程序启动时创建(调用main来启动),主线程的生命周期是和应用程序绑定,程序退出时,主线程也停止;

iOS多线程开发--NSThread NSOperation GCD

多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验.早在单核处理器时期 就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行, 不影响用户其他UI操作),其处理能力并没有明显的变化.如今无论是移动操作系统还是PC.服务器都是多核处理器,于是“并行

iOS:多线程NSThread的详细使用

NSThread具体使用:直接继承NSObject NSThread:. 优点:NSThread 是轻量级的,使用简单 缺点:需要自己管理线程的生命周期.线程同步.线程同步对数据的加锁会有一定的系统开销 1.属性 @property (readonly, retain) NSMutableDictionary *threadDictionary;  //线程字典 @property double threadPriority;                                  

ios 开启线程定时请求某个方法

- (void)startLoop { [NSThread detachNewThreadSelector:@selector(loopMethod) toTarget:self withObject:nil]; } - (void)loopMethod { [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(requestIsHaveReview) userInfo:nil repeats:YE