您的位置:首页 > 移动开发 > IOS开发

iOS开发多线程-创建线程

2015-11-24 00:33 645 查看

iOS中实现多线程的方案有4种



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

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

  创建、启动线程

  (1) 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.使用古老的方式创建

#import "ViewController.h"
#import <pthread.h> // pthread是C语言中的,使用时要导入头文件

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

}

// 按钮的点击事件
- (IBAction)btnClick {
// 获取当前线程
NSThread *current = [NSThread currentThread];

// 主线程
NSLog(@"btnClick---%@", current);

// 使用for循环执行一些耗时的操作
pthread_t thread;
// 多个线程,点击按钮的时候,主线程不会被阻塞
/**
*  参数1:线程对象
*  参数2:线程属性
*  参数3:指向函数的指针
*  参数4:函数的{参数}
*/
pthread_create(&thread, NULL, run, NULL);
}

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

for (NSInteger i = 0; i < 10000; i++) {
NSLog(@"run---%zd---%@", i, current);
}
return NULL;
}

@end


实现效果:



打印结果:



2.使用NSThread创建线程

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

}

// 按钮的点击事件
- (IBAction)btnClick {
// 获取到当前线程
NSThread *current = [NSThread currentThread];

// 主线程
NSLog(@"btnClick---%@", 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";
// 设置优先级 0.0~1.0 默认是0.5  最高是1.0
thread.threadPriority = 1.0;
// 开启线程
[thread start];

NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"线程B"];
// 设置线程的名称
thread2.name = @"线程B";
// 开启线程
[thread2 start];
}

/**
*  NSThread创建线程方式2
*  创建完线程直接(自动)启动
*/
- (void)creatNSThread2
{
// 分离出一条子线程,自动启动,不能详细的设置线程对象
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"创建完线程直接(自动)启动"];
}

/**
*  NSThread创建线程方式2
*  隐式创建线程,并且直接(自动)启动
*/
- (void)creatNSThread3
{
// 开启后台线程,自动启动,不能详细的设置线程对象
[self performSelectorInBackground:@selector(run:) withObject:@"隐式创建"];
}

- (void)run:(NSString *)str
{
// 获取当前线程
NSThread *current = [NSThread currentThread];

// 打印输出
for (NSInteger i = 0; i < 10; i++) {
NSLog(@"run---%@---%@", current, str);
}
}

@end


调用线程1



调用线程2



调用线程3

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程