多线程 —— NSThread

什么是进程?
进程是指在系统中 正在运行 的一个应用程序
每个进程之间是 独立 每个进程均运行在其专用且受保护的内存空间内
(说白了就是一块独立的内存空间)

什么是线程?
1 个进程要想执行任务, 必须 得有线程( 1 个进程至少要有 1 条线程
线程是进程的基本执行单元 ,一个进程(程序)的所有任务都在线程中执行



NSThread的使用

一个 NSThread 对象就代表一条线程

创建、启动线程

// 创建线程方式1
- (void)test1
{
    // 实例化一个线程对像
    // target:谁要创建线程
    // selector:为那个方法开辟线程
    // objec:传给run方法的参数
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];
    
    // 让线程开始工作,启动线程, 在新开的线程执行run方法
    [thread start];
    
}

// 创建线程方式2
- (void)test2
{
    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"hello"];
    
}

// 创建线程方式3
- (void)test3
{
    // “隐式”创建线程方式
    [self performSelectorInBackground:@selector(run:) withObject:@"cz"];
}

第2种与第3种创建方式的优缺点:
优点:简单快捷,创建后自动启动
缺点:无法获取线程对象,也就无法对线程进行更详细的设置

主线程相关用法

+ (NSThread *)mainThread; //获得主线程

- (BOOL)isMainThread; //是否为主线程

+ (BOOL)isMainThread; //是否为主线程


其他用法

获得当前线程

NSThread*current = [NSThread currentThread];

线程的调度优先级

+ (double)threadPriority;

+ (BOOL)setThreadPriority:(double)p;

- (double)threadPriority;

- (BOOL)setThreadPriority:(double)p;

 NSThread *threadA = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"hello"];
    
    threadA.name = @"thraed A";
    
    // 线程优先级
    // 是一个浮点数,0.0~1.0。 默认值 0.5
    // 开发的时候,一般不去修改优先级的值。
    // 优先级,必须调用很多次的时候,才能体现出来。
    threadA.threadPriority = 0.1;
    
    // 开始工作
    [threadA start];

调度优先级取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高


线程的 名字

- (void)setName:(NSString *)n;

-( NSString*)name;

线程的状态


控制线程状态

启动线程
// 进入就绪状态 ->运行状态当线程任务执行完毕,自动进入死亡状态

- (void)start;


阻塞 (暂停)线程
// 进入阻塞状态

+ (void)sleepUntilDate:(NSDate*)date;

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;


强制停止线程
// 进入死亡状态

+ (void)exit;


注意:一旦线程停止(死亡)了,就不能再次开启任务


多线程的安全隐患

1 块资源可能会被多个线程共享,也就是 多个线程可能会访问同一块资源
当多个线程访问同一块资源时,很容易引发 数据错乱和数据安全 问题
安全隐患解决互斥锁

互斥锁使用格式

@synchronized(锁对象) { // 需要锁定的代码  }

开发的时候,一般就使用selfOK

苹果不推荐我们使用加锁。因为加锁,性能太差。

注意:锁定1份代码只用1把锁,用多把锁是无效的

互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的 CPU 资源

互斥锁的使用前提 多条线程抢夺同一块资源

相关专业术语: 线程同步
线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
互斥锁,就是使用了线程同步技术

/**

 1. 开发比较复杂的多线程程序时,可以先在主线程把功能实现

 2. 实现功能以后,再把耗时的功能再放到子线程

 3. 再增加一个线程,建议开发的时候,线程一个一个增加

 */

/**

 加锁,互斥锁

 加锁,锁定的代码尽量少。

 加锁范围内的代码, 同一时间只允许一个线程执行

 互斥锁的参数:任何继承 NSObject *对象都可以。

 要保证这个锁,所有的线程都能访问到, 而且是所有线程访问的是同一个锁对象

 */


线程间通信
什么叫做线程间通信
1 个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信

线程间通信的体现
1 个线程传递数据给另 1 个线程
1 个线程中执行完特定任务后,转到另 1 个线程继续执行任务

线程间通信常用方法

//在主线程执行 selector 方法

//(id)arg:传递给selector方法的参数
//(BOOL)wait:是否等待selector方法执行结束

- (void)performSelectorOnMainThread:(SEL)aSelector  withObject:(id)arg  waitUntilDone:(BOOL)wait;


// 在指定线程执行selector方法

- (void)performSelector:(SEL)aSelector  onThread:(NSThread *)thr  withObject:(id)arg  waitUntilDone:(BOOL)wait;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值