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

一个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.使用古老的方式创建

   YYViewController.m
10 #import "YYViewController.h"
11 #import <pthread.h>
14 @interface YYViewController ()
15 - (IBAction)btnClick;
16 @end
19 @implementation YYViewController
22 - (void)viewDidLoad
23 {
24 [super viewDidLoad];
25 }
28 //按钮的点击事件
29 - (IBAction)btnClick {
30 //1.获取当前线程
31 NSThread *current=[NSThread currentThread];
32 //主线程
33 NSLog(@"btnClick----%@",current);
34
35 //2.使用for循环执行一些耗时操作
36 pthread_t thread;
37 pthread_create(&thread, NULL, run, NULL);
38 }
41 //c语言函数
42 void *run(void *data)
43 {
44 //获取当前线程,是新创建出来的线程
45 NSThread *current=[NSThread currentThread];
48 for (int i=0; i<10000; i++) {
49 NSLog(@"btnClick---%d---%@",i,current);
50 }
51 return NULL;
52 }
54 //多个线程,点击按钮执行按钮调用方法的时候,主线程没有被阻塞
56 @end

实现效果:

打印结果:

2.使用NSThread创建线程

  1 //
2 // YYViewController.m
5 // Created by apple on 14-6-23.
6 // Copyright (c) 2014年 itcase. All rights reserved.
7 //
8
9 #import "YYViewController.h"
10 #import <pthread.h>
13 @interface YYViewController ()
14 - (IBAction)btnClick;
15 @end
18 @implementation YYViewController
20 - (void)viewDidLoad
21 {
22 [super viewDidLoad];
23 }
 26 //按钮的点击事件
27 - (IBAction)btnClick {
28 //1.获取当前线程
29 NSThread *current=[NSThread currentThread];
30 //主线程
31 NSLog(@"btnClick----%@",current);
32
33 //获取主线程的另外一种方式
34 NSThread *main=[NSThread mainThread];
35 NSLog(@"主线程-------%@",main);
36
37 //2.执行一些耗时操作
38 [self creatNSThread];
39 // [self creatNSThread2];
40 // [self creatNSThread3];
41 }
44 /**
45 * NSThread创建线程方式1
46 * 1> 先创建初始化线程
47 * 2> start开启线程
48 */
49 -(void)creatNSThread
50 {
51 NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"线程A"];
52 //为线程设置一个名称
53 thread.name=@"线程A";
54 //开启线程
55 [thread start]; 58 NSThread *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"线程B"];
59 //为线程设置一个名称
60 thread2.name=@"线程B";
61 //开启线程
62 [thread2 start];
63 } 66 /**
67 * NSThread创建线程方式2
68 *创建完线程直接(自动)启动
69 */
70
71 -(void)creatNSThread2
72 {
73 // NSThread *thread=[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"创建完线程直接(自动)启动"];
74
75 [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"创建完线程直接(自动)启动"];
76 } 79 /**
80 * NSThread创建线程方式3
81 * 隐式创建线程, 并且直接(自动)启动
82 */
83
84 -(void)creatNSThread3
85 {
86 //在后台线程中执行===在子线程中执行
87 [self performSelectorInBackground:@selector(run:) withObject:@"隐式创建"];
88 } 92 -(void)run:(NSString *)str
93 {
94 //获取当前线程
95 NSThread *current=[NSThread currentThread];
96 //打印输出
97 for (int i=0; i<10; i++) {
98 NSLog(@"run---%@---%@",current,str);
99 }
100 }
101 @end

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

调用线程2

调用线程3

iOS多线程编程之创建线程(转载)的更多相关文章

  1. iOS多线程编程之创建线程安全(转载)

    一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数 ...

  2. java多线程编程(二创建线程)

    1.概念           因为java是完全面向对象的,所以在java中,我们说的线程,就是Thread类的一个实例对象.所以,一个线程就是一个对象,它有自己字段和方法. 2.创建线程 创建线程有 ...

  3. iOS多线程编程之自定义NSOperation(转载)

    一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // ...

  4. iOS多线程编程原理及实践

    摘要:iOS开发中,开发者不仅要做好iOS的内存管理,而且如果你的iOS涉及多线程,那你也必须了解iOS编程中对多线程的限制,iOS主线程的堆栈大小为1M,其它线程均为512KB,且这个限制开发者是无 ...

  5. iOS多线程编程指南

    iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...

  6. iOS多线程编程之线程的状态(转载)

    一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; ...

  7. iOS多线程编程指南(二)线程管理

    当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何 ...

  8. iOS多线程编程之多线程简单介绍(转载)

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“ ...

  9. IOS高级编程之三:IOS 多线程编程

    多线程的概念在各个操作系统上都会接触到,windows.Linux.mac os等等这些常用的操作系统,都支持多线程的概念. 当然ios中也不例外,但是线程的运行节点可能是我们平常不太注意的. 例如: ...

随机推荐

  1. MyBatis入门程序之mapper映射文件常用配置命令

    1.ResultMap高级结果映射 如果查询出的列名和属性名不一致,可以通过ResultMap做映射,放在statement的输出类型中 如下: 2.动态SQL,使用各种动态标签实现动态拼接sql,常 ...

  2. Python 爬虫系列:糗事百科最热段子

    1.获取糗事百科url http://www.qiushibaike.com/hot/page/2/    末尾2指第2页 2.分析页面,找到段子部分的位置, 需要一点CSS和HTML的知识 3.编写 ...

  3. linux clamav杀毒软件的安装

    一.概述 Linux比其它操作系统更稳定更安全.理论上Linux是有可能被病毒侵害的.但实际上 Linux机器几乎不可能遭受病毒的攻击.所以我这里的问题是为什么要为Linux准备防病毒软件,为了更好理 ...

  4. 深入浅出MFC——MFC骨干程序(四)

    1. 熟记MFC类层次结构: 2. AppWizard可以为我们制作出MFC程序骨干: 3. Document/View支撑你的应用程序:Document/View的价值在于,这些MFC类已经把一个应 ...

  5. codeblocks编码设置

    注意编码统一,即文件编码和编译时的编码统一即可. codeblock13.12下: 文件编码: setting -> editor ->general setting -> othe ...

  6. SpringMVC实现多文件(批量)上传

    1.springMVC实现多文件上传需要的包如图2.webroot下的结构如图所示 3.java代码: package cn.lxc.controller; import java.io.File; ...

  7. React Native 开发工具篇

    正文 概述:开发RN的工具有很多,选择性也比较多,比如Facebook专门为React开发的IDE:Nuclide,还有做前端比较熟悉的WebStorm.Sublime Text 3.VS Code等 ...

  8. Maven —— scope 元素的值及其含义

    1.compile 缺省值,所属依赖在所有的classpath中可用,同时它们也会被打包(随着项目一起发布). 2.provided 只有当JDK或者某个容器已提供该依赖之后才使用.如servlet. ...

  9. css3整理--text-shadow

    text-shadow语法: text-shadow:[颜色(Color) x轴(X Offset) y轴(Y Offset) 模糊半径(Blur)],[颜色(color) x轴(X Offset) ...

  10. div里粘贴文字后,移动光标至最后

    cursormanager.js //Namespace management idea from http://enterprisejquery.com/2010/10/how-good-c-hab ...