美文网首页
NSThread实现多线程

NSThread实现多线程

作者: _叫我小贱 | 来源:发表于2016-04-06 16:41 被阅读146次
  • 创建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);
    }
}

相关文章

网友评论

      本文标题:NSThread实现多线程

      本文链接:https://www.haomeiwen.com/subject/prcmlttx.html