iOS开发多线程--创建线程

创建线程启动线程的简单说明

  • 一个NSThread对象就代表一条线程
    创建、启动线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];
[thread start];
// 线程一启动,就会在线程thread中执行self的run方法
// 这个object的参数实在run方法里的参数
  • 主线程相关用法
  + (NSThread *)mainThread; // 获得主线程

  - (BOOL)isMainThread; // 是否为主线程

  + (BOOL)isMainThread; // 是否为主线程
  • 其他用法
    获得当前线程
NSThread *current = [NSThread currentThread];
  • 线程的调度优先级:调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
 + (double)threadPriority;
 + (BOOL)setThreadPriority:(double)p;
  • 设置线程的名字
 - (void)setName:(NSString *)n;
 - (NSString *)name;
  • 其他创建线程的方式,创建线程后自动启动线程
 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
  • 隐式创建并启动线程
 [self performSelectorInBackground:@selector(run) withObject:nil];

上述2种创建线程方式的优缺点
优点:简单快捷
缺点:无法对线程进行更详细的设置

下边是代码示例:
  • 使用NSThread 创建线程:
@interface ViewController ()
@property(nonatomic,strong)UIButton * button;
@end
@implementation ViewController
 - (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.button];
}
 - (UIButton *)button
{
    if (_button == nil) {
        _button = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
        _button.backgroundColor = [UIColor brownColor];
        [_button addTarget:self  action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return _button;
}
 - (void)buttonClick
{
    //获取当前线程
   NSThread *current=[NSThread currentThread];
   //主线程
       NSLog(@"当前的线程----%@",current);
    //获取主线程的另外一种方式
   NSThread *main=[NSThread mainThread];
      NSLog(@"主线程-------%@",main);
         //执行一些耗时操作
    [self creatNSThread];
    //    [self creatNSThread2];
   //    [self creatNSThread3];
}
  /**
  * NSThread创建线程方式1
  * 1> 先创建初始化线程
  * 2> start开启线程
  */
  - (void)creatNSThread
{
     NSThread  *thread=[[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"线程A"];
     //为线程设置一个名称
    thread.name=@"线程A";
      //开启线程
     [thread start];
    NSThread  *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"线程B"];
     //为线程设置一个名称
    thread2.name=@"线程B";
   //开启线程
    [thread2 start];
}
 /**
  * NSThread创建线程方式2
  *创建完线程直接(自动)启动
  */
 - (void)creatNSThread2
 {
//    NSThread *thread=[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"创建完线程直接(自动)启动"];
    
         [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"创建完线程直接(自动)启动"];
}
  /**
  * NSThread创建线程方式3
  * 隐式创建线程, 并且直接(自动)启动
  */
  - (void)creatNSThread3
 {
        //在后台线程中执行===在子线程中执行
        [self performSelectorInBackground:@selector(run:) withObject:@"隐式创建"];
 }
  - (void)run:(NSString *)str
 {
        //获取当前线程
         NSThread *current=[NSThread currentThread];
         //打印输出
        for (int i=0; i<10; i++) {
             NSLog(@"run---%@---%@",current,str);
    }
}
 - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end

自己去试试这些代码的运行结果

你可能感兴趣的:(iOS开发多线程--创建线程)