- 创建NSThread有三种方式
//1.创建一个新线程对象
-(instancetype)initWithTarget:(id)target selector:(SEL)sel object:(id)arg
//2.创建并启动新线程
+(void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
//3.隐式创建并启动线程
-()void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg
三种方法都是将target对象的selector方法转换为线程执行体,selector最多接收一个参数,arg代表传给selector方法的参数。
- 举个🌰:
-(void)viewDidLoad {
[super viewDidLoad];
for (int i = 0; i < 100; i++) {
NSLog(@"===%@===%d",[NSThread currentThread], i);
if (i == 20) {
//创建线程的对象
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
//启动线程
[thread start];
[NSThread sleepForTimeInterval:0.001];
//创建并启动新线程
//[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
}
}
}
-(void)run{
for (int i = 0; i < 100; i++) {
NSLog(@"-----%@------%d",[NSThread currentThread], i);
}
}
-
+(NSThread *)currentThread:返回当前正在执行的线程对象。
-
此程序创建了两个线程,程序显式的创建了一个子线程。当iOS应用运行后,至少创建一个主线程(UI线程)。
-
程序创建线程后,该线程处于新建状态,但是系统仅仅为其分配了内存,并初始化了成员变量的值。此时的线程对象没有线程的动态特征,程序也不会执行线程的执行体。在调用start方法后,该线程处于就绪状态,何时运行取决于系统调度。
-
线程的结束方式
1.线程执行体方法执行完成,线程正常结束。
2.线程执行过程中出现错误。
3.调用NSThread类的exit方法终止当前正在执行的线程。
举个🌰:
@implementation FKViewController
NSThread* thread;
- (void)viewDidLoad
{
[super viewDidLoad];
// 创建新线程对象
thread = [[NSThread alloc] initWithTarget:self selector:@selector(run)
object:nil];
// 启动新线程
[thread start];
//[self performSelectorInBackground:@selector(run) withObject:nil];
}
- (void)run
{
for(int i = 0 ; i < 100 ; i++)
{
if([NSThread currentThread].isCancelled)
{
// 终止当前正在执行的线程
[NSThread exit];
}
NSLog(@"-----%@----%d" , [NSThread currentThread].name, i);
// 每执行一次,线程暂停0.5秒
[NSThread sleepForTimeInterval:0.5];
}
}
- (IBAction)cancelThread:(id)sender
{
// 取消thread线程,调用该方法后,thread的isCancelled方法将会返回NO
[thread cancel];
}
@end
-
thread对象调用cancel方法,向thread对象发送取消信号,这样可以使thread对象的isCancelled方法返回YES。(在线程执行过程中isExecuting方法返回YES;线程执行完成后isFinished方法返回YES)
-
线程对象调用exit方法终止线程。
-
+(void)sleepForTimeInterval:(NSTimeInterval)ti
让当前正在执行的线程暂停ti秒,进入阻塞状态。 -
+(void)sleepUntilDate:(NSDate *)aDate
让当前正在执行的线程暂停到aDate代表的时间,并进入阻塞状态。 -
线程优先级
1.+threadPriority:该类方法获取正在执行线程的优先级。
2.-threadPriority:该实例方法获取调用该方法的线程对象的优先级。
3.+(BOOL)setThreadPriority:(double)priority:该类方法用于设置当前正在执行的线程的优先级。
4.-(BOOL)setThreadPriority:(double)priority:该实例方法用于设置当前正在执行的线程的优先级。
注意:setThreadPriority:(double)priority方法的参数可以是一个double类型的浮点数,范围为0.0~1.0,其中1.0等级最高,0.0等级最低。
- 举个🌰:
-(void)viewDidLoad {
[super viewDidLoad];
NSLog(@"UI线程的优先级为:%g", [NSThread threadPriority]);
//创建第一个线程对象
NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
//设置线程的名字
thread1.name = @"线程A";
NSLog(@"线程A的优先级为:%g",thread1.threadPriority);
//设置使用最低优先级
thread1.threadPriority = 0.0;
NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
thread2.name = @"线程B";
NSLog(@"线程A的优先级为:%g",thread2.threadPriority);
thread2.threadPriority = 1.0;
[thread1 start];
[thread2 start];
}
-(void)run{
for (int i = 0; i < 100; i++) {
NSLog(@"-----%@-----%d",[NSThread currentThread].name, i);
}
}
网友评论