关闭

iOS 多线程篇2—创建线程

标签: ios多线程
148人阅读 评论(0) 收藏 举报
分类:

一、创建和启动线程简单说明

一个NSThread对象就代表一条线程

创建、启动线程

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start];

// 线程一启动,就会在线程thread中执行self的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;

其他创建线程的方式
(2)创建线程后自动启动线程

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

(3)隐式创建并启动线程

[self performSelectorInBackground:@selector(run) withObject:nil];

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

二、代码示例

1.使用古老的方式创建

//
//  YYViewController.m
//
//
//  Created by apple on 14-6-23.
//  Copyright (c) 2014年 itcase. All rights reserved.
//


#import "YYViewController.h"
#import <pthread.h>


@interface YYViewController ()
- (IBAction)btnClick;
@end


@implementation YYViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
}


//按钮的点击事件
- (IBAction)btnClick {
    //1.获取当前线程
    NSThread *current=[NSThread currentThread];
    //主线程
    NSLog(@"btnClick----%@",current);   

    //2.使用for循环执行一些耗时操作
   pthread_t thread;
    pthread_create(&thread, NULL, run, NULL);
}


//c语言函数
void *run(void *data)
{
    //获取当前线程,是新创建出来的线程
    NSThread *current=[NSThread currentThread];


    for (int i=0; i<10000; i++) {
        NSLog(@"btnClick---%d---%@",i,current);
    }
    return NULL;
}

//多个线程,点击按钮执行按钮调用方法的时候,主线程没有被阻塞

@end

实现效果:

image

打印结果:
image

2.使用NSThread创建线程

//
//  YYViewController.m
//
//
//  Created by apple on 14-6-23.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import <pthread.h>


@interface YYViewController ()
- (IBAction)btnClick;
@end


@implementation YYViewController 

- (void)viewDidLoad
{
    [super viewDidLoad];
}


//按钮的点击事件
- (IBAction)btnClick {
    //1.获取当前线程
    NSThread *current=[NSThread currentThread];
    //主线程
    NSLog(@"btnClick----%@",current);

    //获取主线程的另外一种方式
   NSThread *main=[NSThread mainThread];
    NSLog(@"主线程-------%@",main);

    //2.执行一些耗时操作
    [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);
    }
}
@end

调用线程1,打印结果为:
image
调用线程2
image
调用线程3
image

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:141244次
    • 积分:3865
    • 等级:
    • 排名:第8538名
    • 原创:233篇
    • 转载:117篇
    • 译文:0篇
    • 评论:5条