iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

一、iOS中的多线程

  • 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块)

  • iOS中多线程的实现方案有以下几种

二、NSThread线程类的简单实用(直接上代码)

  

三、多线程的安全隐患

  • 资源共享
    • 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
    • 比如多个线程访问同一个对象、同一个变量、同一个文件
  • 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题(存钱取钱的例子,多个售票员卖票的例子)
  • 安全隐患解决的方法 --- 互斥锁(图解)

  • 互斥锁简单介绍

  • 售票员卖票例子的代码实现
 1 #import "ViewController.h"
 2
 3 @interface ViewController ()
 4 /** Thread01 */
 5 @property(nonatomic,strong) NSThread *thread01;
 6 /** Thread02 */
 7 @property(nonatomic,strong) NSThread *thread02;
 8 /** Thread03 */
 9 @property(nonatomic,strong) NSThread *thread03;
10 /** ticketCount */
11 @property(nonatomic,assign) NSInteger ticketCount;
12 @end
13
14 @implementation ViewController
15
16 - (void)viewDidLoad {
17     [super viewDidLoad];
18
19     self.ticketCount = 100;
20
21     // 线程创建之后不执行start  出了大括号会被销毁,所以这里用成员变量存了起来
22     self.thread01 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
23     self.thread01.name = @"售票员01";
24     self.thread02 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
25     self.thread02.name = @"售票员02";
26     self.thread03 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
27     self.thread03.name = @"售票员03";
28 }
29
30 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
31
32     [self.thread01 start];
33     [self.thread02 start];
34     [self.thread03 start];
35
36 }
37
38 - (void)saleTicket
39 {
40     @synchronized(self) { // 添加互斥锁,括号中的什么对象都可以,但是必须是同一个!
41
42         while (1) {
43             // 取出剩余票总数
44             NSInteger count = self.ticketCount;
45             if (count > 0) {
46                 self.ticketCount = count - 1;
47                 NSLog(@"%@卖出了车票,还剩%ld",[NSThread currentThread].name,self.ticketCount);
48             } else {
49
50                 NSLog(@"%@把车票卖完了",[NSThread currentThread].name);
51                 break;
52             }
53
54         }
55     }
56 }
57
58 @end
  • 不加互斥锁打印的结果如图:

四、原子和非原子属性--atomic、nonatomic

五、线程之间的通信(练习:下载图片的练习)

时间: 2024-08-09 20:07:01

iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信的相关文章

iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 系统会自动将NSOperationQueue中的NSOperation取出来 将取出的NSOperation封装的操作放到一条新线程中执行 NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 使用NSOperation子类的方式有3种 N

iOS边练边学--多线程练习的多图片下载 以及 使用第三方框架(SDWebImage)的多图片下载

一.自己实现多图片下载应该注意的问题 沙盒缓存的问题 程序缓存的问题 cell重复利用显示图片混乱的问题 -- 用户拖拽快,下载图片慢导致的 解决图片混乱引入NSOperation集合的问题 资源下载失败的问题(练习中没有出现过,但是一定要考虑) 1 #import "ChaosViewController.h" 2 #import "ChaosApp.h" 3 4 @interface ChaosViewController () 5 /** 模型集合 */ 6

java多线程基本概念与简单实用

概述 程序:Program,是一个静态的概念 进程:Process,是一个动态的概念 进程是程序的一次动态执行过程, 占用特定的地址空间.每个进程都是独立的,由3部分组成cpu,data,code 缺点:内存的浪费,cpu的负担 线程:Thread,是进程中一个"单一的连续控制流程"  (a single sequential flow ofcontrol)/执行路径.线程又被称为轻量级进程(lightweight process). 一个进程可拥有多个并行的(concurrent)线

猫猫学iOS(五十)多线程网络之GCD简单介绍(任务,队列)

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为"牛逼的中枢调度器" 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务

iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法

一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessionDataTask的GET和POST  -- 以及url中包含了中文的解决办法 <2>NSURLSessionDownloadTask实现小文件的下载 <3>NSURLSessionDownloadTask实现大文件的断点下载 -- 暂时没有实现退出程序后的文件续传 1 #import

iOS边练边学--介绍布局的三种方法

使用代码实现Autolayout的方法1- 创建约束 +(id)constraintWithItem:(id)view1attribute:(NSLayoutAttribute)attr1relatedBy:(NSLayoutRelation)relationtoItem:(id)view2attribute:(NSLayoutAttribute)attr2multiplier:(CGFloat)multiplierconstant:(CGFloat)c;* view1 :要约束的控件* att

iOS边练边学--CALayer,非根层隐式动画,钟表练习

一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层 当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘制,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示 UIView本身不具备显示的功能,是他内部的层才有显示功能 二.CALayer的基本使用 三.关于CALa

iOS边练边学--触摸事件以及能够拖拽的UIView的练习

一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此他们都是响应者对象,都能够接受并处理事件 UIResponder内部提供了以下方法来处理事件 三.练习中对UIView的触摸事件进行了熟悉 四.UITouch 一根手指对应一个UITou

iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core Data--这里暂且不讲 一.应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示 二.应用沙盒结构分析 应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件 Do