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中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线