在 iOS/macOS 开发中,NSThread
是用于处理多线程操作的基础类,start
、cancel
和 main
是其核心方法,各自承担不同职责:
1. start()
方法
-
作用:启动线程,将线程从 "新建" 状态切换到 "就绪" 状态,等待系统调度执行。
-
执行流程 :调用
start()
后,系统会在合适时机调用线程的main()
方法(线程的入口点)。 -
注意:
- 一个线程对象只能调用一次
start()
,重复调用会导致异常。 - 调用后线程并非立即执行,而是进入系统的线程调度队列,等待 CPU 分配时间片。
- 一个线程对象只能调用一次
2. main()
方法
-
作用:线程的主执行函数,线程启动后实际运行的代码逻辑都在这里。
-
使用方式:
- 通常需要子类化
NSThread
并重写main()
方法,在其中实现具体任务。 - 也可以通过
NSThread
的初始化方法(如initWithTarget:selector:object:
)指定要执行的方法,替代重写main()
。
- 通常需要子类化
-
注意:
main()
方法执行完毕后,线程会进入 "终止" 状态。- 若在
main()
中处理耗时任务,需定期检查线程是否被取消(见cancel
方法),以便及时退出。
3. cancel()
方法
-
作用:标记线程为 "取消" 状态,但不会立即终止线程。
-
工作原理:
- 仅设置线程的
isCancelled
属性为YES
,不会主动中断线程的执行。 - 需要在
main()
方法中主动检查isCancelled
状态,若为YES
则手动退出任务,实现线程终止。
- 仅设置线程的
-
示例:
objective-c
less// 子类化 NSThread 并重写 main @interface MyThread : NSThread @end @implementation MyThread - (void)main { // 模拟耗时任务,定期检查是否被取消 for (int i = 0; i < 1000; i++) { // 检查取消状态,若已取消则退出 if (self.isCancelled) { NSLog(@"线程被取消,退出执行"); return; } NSLog(@"执行第 %d 步", i); [NSThread sleepForTimeInterval:0.1]; // 模拟耗时 } } @end // 使用线程 MyThread *thread = [[MyThread alloc] init]; [thread start]; // 启动线程 // 一段时间后取消线程 [thread cancel];
总结
start()
:启动线程,触发main()
执行。main()
:线程的核心逻辑执行处,需包含具体任务代码。cancel()
:标记线程为取消状态,需配合isCancelled
检查实现线程退出。