iOS基础 - 线程通信 | 线程切换

▶ 线程通信

在开发中我们经常会在子线程进行耗时操作,等待操作结束后再回到主线程去刷新 UI,这就涉及到了子线程和主线程之间的通信;我们先来了解一下官方关于 NSThread 线程间通信的方法

复制代码
// 在主线程上执行操作
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray<NSString *> *)array;
 // 在指定线程上执行操作
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

// 在当前线程上执行操作,调用 NSObject 的 performSelector: 相关方法
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
复制代码

线程切换原理

A. 线程在创建时 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil] 在内存中的表现为

B. 当调用启程用线程后,系统把线程对象放入可调度线程池中,线程对象进入就绪状态

当然,可调度线程池中也会有其他的线程对象

C. 下面我们来看看当前线程的状态转换

如果 CPU 现在调度当前线程对象,则当前线程对象进入运行状态;如果 CPU 调度其他线程对象,则当前线程对象回到就绪状态

如果 CPU 在运行当前线程对象的时候调用了 sleep 方法/等待同步锁,则当前线程对象就进入了阻塞状态;等到 sleep 到时/得到同步锁,则回到就绪状态

如果 CPU 在运行当前线程对象的时候线程任务执行完毕/异常强制退出,则当前线程对象进死亡状态

注:当线程的任务结束、发生异常、强制退出这三种情况会导致线程的死亡人死不能复生,线程死了同样也不能复生(重启)!如果在线程死亡之后,再次点击屏幕尝试重新开启线程,则程序 crash

 

▶ 多线程的缺点和优点

坏处

A. 开启线程需要占用一定的内存空间(默认情况下,主线程占用 1M,子线程占用 512 KB)。如果开启大量的线程,会占用大量的内存空间,降低程序的性能!线程越多,CPU 在调度线程上的开销就越大

B. 程序设计更加复杂:比如线程之间的通信、多线程的数据共享

好处

A. 能适当提高程序的执行效率

C. 能适当提高资源利用率(CPU、内存利用率)

 

posted on   低头捡石頭  阅读(246)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示