上一篇文章中我们大致了解了GCD的模式和方法,在iOS开发中除了GCD之外,还有NSThread和NSOperation两种多线程方式。

  1.NSThread

  - a - 使用NSThread开辟多线程进行子任务处理:类方法和初始化方法

  使用类方法不需要创建对象就可以直接开辟多线程并发;而创建NSThread对象进行开辟则需要使用 - (void)start 方法进行线程启动。

 1 #import "ViewController.h"
 2
 3 typedef NS_ENUM(NSInteger, ENSThreadType) {
 4     kNSThreadClassFunc,
 5     kNSThreadInitFunc,
 6 };
 7
 8 @interface ViewController ()
 9
10 @end
11
12 @implementation ViewController
13
14 - (void)viewDidLoad {
15     [super viewDidLoad];
16
17     [self threadWithType:kNSThreadInitFunc times:10];
18
19 }
20
21 - (void)threadWithType:(ENSThreadType)type times:(int)time{
22     for(int i = 0; i < time; i++){
23         NSString *str = [NSString stringWithFormat:@"测试+%d", i];
24
25         switch (type) {
26             case kNSThreadClassFunc:{
27                 // ①类方法
28                 [NSThread detachNewThreadSelector:@selector(func:) toTarget:self withObject:str];
29             }
30                 break;
31             case kNSThreadInitFunc:{
32                 // ②初始化方法
33                 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(func:) object:str];
34                 thread.name = str;
35                 [thread start];
36             }
37                 break;
38             default:
39                 break;
40         }
41
42     }
43 }
44
45 - (void)func:(NSString*)str{
46     NSLog(@"%@ %@", str, [NSThread currentThread]);
47 }
48
49 @end

  

  - b - NSThread实例方法,创建了NSThread对象后,可以调用它的实例方法:

 1 #import "ViewController.h"
 2
 3 typedef NS_ENUM(NSInteger, ENSThreadObjFunc) {
 4     // kThreadObjFuncThread,
 5     kThreadObjFuncMain,
 6     kThreadObjFuncBackground,
 7 };
 8
 9 @interface ViewController ()
10 {
11     NSThread *aThread;
12 }
13 @end
14
15 @implementation ViewController
16
17 - (void)viewDidLoad {
18     [super viewDidLoad];
19
20     aThread = [[NSThread alloc] initWithTarget:self selector:@selector(func:) object:@"测试参考线程"];
21     [aThread start];
22
23     [self threadObjFuncWithType:kThreadObjFuncMain thread:aThread times:10];
24
25 }
26
27 - (void)func:(NSString*)str{
28     NSLog(@"%@ %@", str, [NSThread currentThread]);
29 }
30
31 - (void)threadObjFuncWithType:(ENSThreadObjFunc)type thread:(NSThread*)thread times:(int)time{
32
33     for(int i = 0; i < time; i ++){
34         switch (type) {
35             case kThreadObjFuncMain:{
36                 // ①主线程队列中执行,同步
37                 NSString *str = [NSString stringWithFormat:@"主线程队列+%d", i];
38                 [self performSelectorOnMainThread:@selector(func:) withObject:str waitUntilDone:YES];
39             }
40                 break;
41             case kThreadObjFuncBackground:{
42                 // ②后台执行,并行异步
43                 NSString *str = [NSString stringWithFormat:@"后台执行+%d", i];
44                 [self performSelectorInBackground:@selector(func:) withObject:str];
45             }
46                 break;
47             // case kThreadObjFuncThread:{
48                 // ③在某一线程队列执行,类似于串行异步
49                 // NSString *str = [NSString stringWithFormat:@"方法+%d", i];
50                 // [self performSelector:@selector(func:) onThread:thread withObject:str waitUntilDone:YES];
51             // }
52                 // break;
53             default:
54                 break;
55         }
56     }
57 }
58
59 @end

转载于:https://www.cnblogs.com/kriskee/p/5368155.html

浅谈多线程——NSThread相关推荐

  1. 浅谈多线程——NSOperation

    iOS中多线程相关方法--NSOperation及其相关类: NSOperation NSBlockOperation NSInvocationOperation NSOperationQueue 1 ...

  2. 为什么cpu要一心二用:浅谈多线程编程的一个具体例子

    什么是多线程,多线程就是多个执行序列.就是让cpu执行下这个序列,又执行下那个序列,不停地切换, 正所谓一心二用. 考虑一个实际场景: 客户端要向服务端发送文件,服务端会对发送文件进行检查,如果文件的 ...

  3. 浅谈多核CPU、多线程与并行计算

    浅谈多核CPU.多线程与并行计算 xiaofei0859 2017-05-09 17:07:11  3646  收藏 展开 0.前言 笔者用过MPI和C#线程池,参加过比赛,有所感受,将近一年来,对多 ...

  4. 多线程之旅之四——浅谈内存模型和用户态同步机制

     用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作   interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...

  5. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  6. js打印线程id_浅谈python中的多线程和多进程(二)

    原创:hxj7 本文继续分享一个关于python多线程和多进程区别的例子 前文<浅谈python中的多线程和多进程>中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高 ...

  7. linux的多任务 多进程,浅谈linux模拟多线程崩溃和多进程崩溃

    结论是: 多线程下如果其中一个线程崩溃了会导致其他线程(整个进程)都崩溃: 多进程下如果其中一个进程崩溃了对其余进程没有影响: 多线程 #include #include #include #incl ...

  8. 获得进程id_浅谈python中的多线程和多进程(二)

    原创:hxj7 本文继续分享一个关于python多线程和多进程区别的例子 前文<浅谈python中的多线程和多进程>中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高 ...

  9. 【kafka】浅谈Kafka的多线程消费的设计

    1.概述 转载:浅谈Kafka的多线程消费的设计 看原文去... 一.前言 跟RabbitMQ相比,Kafka的分区机制(Partition)使其支持对同一个"队列"分片并行读取, ...

最新文章

  1. 理解什么是MyBatis?
  2. Visual Transformers: Token-based Image Representation and Processing for Computer Vision
  3. Install FileZilla in Ubuntu16.04
  4. 用Pytorch实现三个优秀的自然图像分割框架!(包括FCN、U-Net和Deeplab,可直接训练预测)
  5. Logstash同步mysql一对多数据到ES(踩坑日记系列)
  6. [C++学习笔记](double*)malloc(n * sizeof(double));
  7. controller方法要trycatch吗_拜托,别再满屏try catch了,试试统一异常处理吧
  8. struct 和enum的用法
  9. 【英语学习】【Daily English】U06 Shopping L04 I like everything aboutit but the price.
  10. Android 系统(38)---Android抓取各种log的方法
  11. 关于字符串和字符数组的再讨论
  12. 一天一种设计模式之三-----单例模式
  13. iec104点号_IEC104规约详细讲解全解.ppt
  14. APUE读书笔记-06系统数据文件和信息-03加密密码
  15. 物流软件之Microcity介绍
  16. 【计算机网络】网络层 : RIP 协议 ( 路由选择协议分类 | RIP 协议简介 | 信息交换 | 距离向量算法 | 计算示例 )★
  17. DBV命令行工具检测坏块
  18. TUIO学习笔记1-TUIO 1.1 Protocol Specification协议规范/标准
  19. JavaScript设计模式-观察者模式
  20. XSS.haozi.me刷题

热门文章

  1. python人工智能方向第三方库_Python进阶-第三方库管理和虚拟环境
  2. C++函数后置返回类型
  3. 可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动
  4. 光端机使用过程中碰到的九大问题
  5. 【渝粤教育】国家开放大学2018年秋季 0551-22T素描(二) 参考试题
  6. 【渝粤题库】陕西师范大学400006 公共关系学 作业(专升本)
  7. [渝粤教育] 西南科技大学 电器设备及维修 在线考试复习资料
  8. 【渝粤题库】陕西师范大学202091公共管理学原理 作业(高起本、专升本)
  9. 【渝粤题库】国家开放大学2021春3990产品管理题目
  10. zigbee与WiFi模块和蓝牙模块的区别是什么?