一、NSThread基本概念

NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同步等问题。

二、创建、启动线程

1、动态实例化 - 先创建再人工启动

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadingImage) object:nil];

// 线程启动,在线程thread中执行self的loadingImage方法
[thread start];

2、静态实例化 - 创建后自启动

// 创建自启动,执行loadingImage方法
[NSThread detachNewThreadSelector:@selector(loadingImage) toTarget:self withObject:nil];

3、隐式实例化 - 创建后自启动

// 创建自启动,执行loadingImage方法
[self performSelectorInBackground:@selector(loadingImage) withObject:nil];

三、线程控制

1、暂停

+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

NSThread的暂停会阻塞当前线程

2、取消

- (void)cancel

NSThread的取消线程并不是马上停止并退出线程,只作(线程是否需要退出)状态标记

3、线程停止

+ (void)exit

 NSThread的停止方法会立即终止除主线程以外所有线程(无论是否在执行任务)并退出,慎用! 否则可能会导致内存问题

四、NSThread的拓展认识

1、一些常用方法

// 获得主线程
+ (NSThread *)mainThread; // 判断是否为主线程(对象方法)
- (BOOL)isMainThread; // 判断是否为主线程(类方法)
+ (BOOL)isMainThread; // 获得当前线程
NSThread *current = [NSThread currentThread];

2、线程优先级设置

//iOS8之前
[NSThread setThreadPriority:1.0]; // (0.0,-1.0,1.0) -----------------------------分割线------------------------------ //iOS8之后
[NSThread setQualityOfService:NSQualityOfServiceUserInitiated]; /*
qualityOfService的枚举值如下:
 NSQualityOfServiceUserInteractive:最高优先级,用于用户交互事件
 NSQualityOfServiceUserInitiated:次高优先级,用于用户需要马上执行的事件
 NSQualityOfServiceDefault:默认优先级,主线程和没有设置优先级的线程都默认为这个优先级
 NSQualityOfServiceUtility:普通优先级,用于普通任务
 NSQualityOfServiceBackground:最低优先级,用于不重要的任务
*/

3、线程间的通信

// 1、指定当前线程执行操作
[self performSelector:@selector(run)];
[self performSelector:@selector(run) withObject:nil];
[self performSelector:@selector(run) withObject:nil afterDelay:3.0f]; -----------------------------分割线------------------------------------------ // 2、指定在主线程执行操作(如更新UI)
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES]; -----------------------------分割线------------------------------------------ // 3、指定在其他线程操作(主线程->新线程) // 这里指定为某个线程newThread
[self performSelector:@selector(run) onThread:newThread withObject:nil waitUntilDone:YES]; // 这里指定为后台线程
[self performSelectorInBackground:@selector(run) withObject:nil];

五、线程同步

多线程不可避免的会带来不同线程并发执行时争夺共享资源的问题(如内存,数据源等),这会造成数据的不一致(脏数据),甚至严重的引起死锁。

线程同步是指是指在一定的时间内只允许某一个线程访问某个资源,这就像是GCD里的栅栏(dispatch_barrier)或者信号量(dispatch_semphore)一样。

目前iOS实现线程加锁有NSLock和@synchronized两种方式

关于线程锁的更多相关知识,请参考文章:http://www.jianshu.com/p/35dd92bcfe8c

iOS多线程开发之NSThread的更多相关文章

  1. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  2. iOS多线程开发之NSOperation - 快上车,没时间解释了!

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  3. iOS多线程开发之NSOperation

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  4. iOS多线程开发之GCD(中级篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  5. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  6. iOS多线程开发之GCD(基础篇)

    总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...

  7. iOS 多线程开发之OperationQueue(二)NSOperation VS GCD

    原创Blog.转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...

  8. iOS 多线程学习笔记 —— NSThread

    本文复制.参考自文章:iOS多线程编程之NSThread的使用  ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://blog.csdn.net/totogo ...

  9. iOS游戏开发之UIDynamic

    iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...

随机推荐

  1. Js判断是否是直接进入本页面的

    今天带来一个Js的小示例,用来判断当前页面的链接来路.很多人应该可以用到,这个虽然非常简单,但是用到的地方却还是挺多的 首先新建一个index.html,代码如下 <!DOCTYPE html& ...

  2. PHP开发微信模版消息换行的问题

    微信是个坑!微信是个坑!微信是个坑!重要的时间说三遍 关键的地方是空白换行符到底是什么也不说,百度说是"\n":但是在发送消息的时候发现原样输出,发现json_encode对\n进 ...

  3. div的替代品

    人们在标签使用中最常见到的错误之一就是随意将HTML5的<section>等价于<div>--具体地说,就是直接用作替代品(用于样式).在XHTML或者HTML4中,我们常看到 ...

  4. [附录]Discuz X2.5 模板目录结构注释说明

    /template/default/common  公共模板目录全局加载 block_forumtree.htm  DIY论坛树形列表模块 block_thread.htm  DIY帖子模块调用文件 ...

  5. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  6. Unity3D常用 API 之 Invoke 函数调用

    1.金钱副本细节完善 1.1.宝箱自动掉落 给宝箱预制体添加刚体组件即可. 1.2.实现按键宝箱批量掉落 ①将实例化生成宝箱的代码单独封装成一个函数: ②使用 for 循环,批量生成宝箱. 按一次z键 ...

  7. Mac远程连接windows报错“证书或相关链无效,是否仍要连接到此计算机”的处理办法。

    这个主要是因为策略组设置的问题.详细的设置方法如下: 本地计算机策略>计算机配置>管理模板>windows组件>远程桌面服务>远程桌面会话主机>安全>远程(R ...

  8. PHPCMS v9 自定义表单添加验证码

    1.  在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id=&quo ...

  9. Angular中使用Swiper不能滑动的解决方法

    Swiper是目前较为流行的移动端触摸滑动插件,因为其简单好用易上手,很受很多设计师的欢迎. 今天在使用Swiper的时候遇到这个问题: 使用angularjs动态循环生成swiper-slide类, ...

  10. CSS实现两端对齐效果

    CSS实现两端对齐效果 两端对齐,从概念上来说,其实不难理解.如果不明白什么叫两端对齐,可以玩玩word等办公软件. 下面谈谈如何实现文本的两端对齐.我所知道的大概有以下几种方法 text-align ...