NSThread-多线程浅析

2024-06-14 04:18
文章标签 多线程 浅析 nsthread

本文主要是介绍NSThread-多线程浅析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:http://blog.sina.com.cn/s/blog_7b9d64af0101cajz.html


任何一个 iOS 应用程序都是由一个或者多个线程构成的。无论你是否显示的使用了多线程编程技术,至少有 1 个 线程被创建。该线程叫做”main UI 线程”,被附加到主事件处理循环中(main run loop)


多线程就是为了提高引用程序的工作效率!避免阻塞主线程!

当我们没有用任何多线程技术的话,默认情况下,是在程序的主线程中执行相关操作!

主线程执行任务

贴个单线程(主线程)执行任务的例子:

// 任务1

- (void) firstCounter{

    NSUInteger counter = 0;

    for (counter = 0;

         counter < 1000;

         counter++){

        NSLog(@"First Counter = %lu", (unsigned long)counter); }

}


// 任务2

- (void) secondCounter{

    NSUInteger counter = 0;

    for (counter = 0;

         counter < 1000;

         counter++){

        NSLog(@"Second Counter = %lu", (unsigned long)counter); }

}


// 任务3

- (void) thirdCounter{

    NSUInteger counter = 0;

    for (counter = 0;

         counter < 1000;

         counter++){

        NSLog(@"Third Counter = %lu", (unsigned long)counter);

    }

}


调用:

- (void)viewDidLoad{

    [super viewDidLoad];

    

    [self firstCounter];

    [self secondCounter];

    [self thirdCounter];


}


输出:

 First Counter = 0

... ...

 First Counter = 999


 

 Second Counter = 0

... ...

 Second Counter = 999


 

 Third Counter = 0

... ...

 Third Counter = 999


你会看到第一个计时器运行完毕,然后是第二个计时器,最后是第三个计时器。也就是说这些循环是在同一个线程运行的。线程代码中被执行的每一块代码一直在运行,直到循 环结束。 

使用多线程执行任务

贴:

- (void)viewDidLoad{

    [super viewDidLoad];

    

    // 开辟一个线程,执行任务

    [NSThread detachNewThreadSelector:@selector(firstCounter)

                             toTarget:self

                           withObject:nil];

    

    // 开辟一个线程,执行任务

    [NSThread detachNewThreadSelector:@selector(secondCounter)

                             toTarget:self

                           withObject:nil];

    

    // 该方法在主线程中执行

    [self thirdCounter];


}


输出:

... ...

 First Counter = 997

 Second Counter = 984

 First Counter = 998

 Second Counter = 985

 First Counter = 999

... ...

可以看到3个线程并行执行。

在后台创建一个线程来执行任务

贴:


[self performSelectorInBackground:@selector(firstCounter) withObject:nil];

    [self performSelectorInBackground:@selector(secondCounter) withObject:nil];

    [self performSelectorInBackground:@selector(thirdCounter) withObject:nil];


performSelectorInBackground方法为我们在后台创建了一个线程。这等同于 我们为 selectors 创建一个新的线程。 但是要记住,必须在调用的方法中加上自动释放池!

// 任务1

- (void) firstCounter{

    @autoreleasepool {

        // MyCode

    

    }

}

来释放掉我们在操作过程中的内存!否则会发生内存泄漏!

对于使用线程的一些建议:

1.当我们需要中途停止线程时,我们不应该调用exit方法,而是调用cancel方法。因为,如果我们直接调用
exit方法的话,线程是直接退出,而没有机会去执行清理操作,可能会产生内存泄漏!

2.我们必须要清楚这么一个现象!
当线程在执行过程中,如果被sleepForTimeInterval后,线程将会被进入休眠。那么在它休眠期间又被cancel后,那么,事实上,线程在醒来后,任然会执行完它的操作。

还是贴给小代码:

线程方法:


// 线程执行

- (void) threadEntryPoint{

    @autoreleasepool {

        NSLog(@"Thread Entry Point");

        while ([[NSThread currentThread] isCancelled] == NO){

            [NSThread sleepForTimeInterval:10];

            NSLog(@"Thread Loop");

        }

        NSLog(@"Thread Finished");

    }

}


// 停止线程

- (void) stopThread{

    NSLog(@"Cancelling the Thread");

    [self.myThread cancel];

    NSLog(@"Releasing the thread");

    self.myThread = nil;

}


调用:

- (void)viewDidAppear:(BOOL)animated{

    

    // 创建线程

    self.myThread = [[NSThread alloc]

                     initWithTarget:self

                     selector:@selector(threadEntryPoint)

                     object:nil];

    

    // 开启线程

    [self.myThread start];

    // 让线程3秒后取消

    [self performSelector:@selector(stopThread) withObject:nil

               afterDelay:3.0f];


}


输出:

 Thread Entry Point

 Cancelling the Thread

 Releasing the thread

 Thread Loop

 Thread Finished


注意,输出的飘红部分,我明明调用了[NSThread sleepForTimeInterval:10];方法让线程进入休眠状态。并且让线程已经执行了stopThread方法中的[self.myThread cancel];方法把线程给取消了。但是,线程在被唤醒后,任然执行了后面的代码!

怎么办?!!!!兄弟们,这不科学啊!!!

说真的,我也不晓得怎么回事!这当然是一个很奇葩的问题!但是,在现实编程中,确实会遇到!

只有改良的办法:多加一层判断!!!

- (void) threadEntryPoint{

    @autoreleasepool {

        NSLog(@"Thread Entry Point");

        while ([[NSThread currentThread] isCancelled] == NO){

            [NSThread sleepForTimeInterval:10];

            if ([[NSThread currentThreadisCancelled] == NO){

                // 做一个改进,在需要执行的代码中,多加一层判断。

                NSLog(@"Thread Loop");

            }

        }

        NSLog(@"Thread Finished");

    }

}


关于线程,就先搞到这里!

希望对你有所帮助!

这篇关于NSThread-多线程浅析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059353

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、