iOS多线程编程之创建线程(转载)
一个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多线程编程之创建线程(转载)的更多相关文章
- iOS多线程编程之创建线程安全(转载)
一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数 ...
- java多线程编程(二创建线程)
1.概念 因为java是完全面向对象的,所以在java中,我们说的线程,就是Thread类的一个实例对象.所以,一个线程就是一个对象,它有自己字段和方法. 2.创建线程 创建线程有 ...
- iOS多线程编程之自定义NSOperation(转载)
一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // ...
- iOS多线程编程原理及实践
摘要:iOS开发中,开发者不仅要做好iOS的内存管理,而且如果你的iOS涉及多线程,那你也必须了解iOS编程中对多线程的限制,iOS主线程的堆栈大小为1M,其它线程均为512KB,且这个限制开发者是无 ...
- iOS多线程编程指南
iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...
- iOS多线程编程之线程的状态(转载)
一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; ...
- iOS多线程编程指南(二)线程管理
当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何 ...
- iOS多线程编程之多线程简单介绍(转载)
一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“ ...
- IOS高级编程之三:IOS 多线程编程
多线程的概念在各个操作系统上都会接触到,windows.Linux.mac os等等这些常用的操作系统,都支持多线程的概念. 当然ios中也不例外,但是线程的运行节点可能是我们平常不太注意的. 例如: ...
随机推荐
- zabbix添加对tomcat线程池的监控
在zabbix模板中添加以下监控项: 可以参考文档:http://www.fblinux.com/?p=616
- >>和<<<区别
1.>>表示右移(有符号右移),如:15>>2的结果是3,-31>>3的结果是-4,左边以该数的符号位补充,移出的部分将被抛弃. 转为二进制的形式可能更好理解(省略 ...
- Perl操作Oracle
一. perl连接Oracle数据库 [oracle@oracle11gR2 perl_script]$ more connect.pl #!/usr/bin/perl #perl script us ...
- U3D的控制
做游戏少不了控制,但是一个成熟的游戏引擎,是不能简单仅仅获取键盘中或者遥感确定的按键来控制,要考虑到用户更改游戏按键的情况,当然也得考虑到不同设备的不通输入方式,比如U3D是可以运行在iphone上的 ...
- [Vim] Vim 常用基本操作
1. 导航 1.1. 查看行号 :set number 显示行号 :set number! 隐藏行号 :.= 在底部显示当前行号 := 在底部显示总行号 1.2. 移动光标 0 或 ^ ...
- 如何在taro的map循环中使用if条件渲染
在taro的jsx中,鉴于编译的机制,官方明确的表示了不能在map循环中使用if循环, 但是呢,官方也给出了解决办法,那就是提取变量或者是用三目运算嵌套的方法: 链接奉上:https://github ...
- codeforces水题100道 第二十一题 Codeforces Beta Round #65 (Div. 2) A. Way Too Long Words (strings)
题目链接:http://www.codeforces.com/problemset/problem/71/A题意:将长字符串改成简写格式.C++代码: #include <string> ...
- Lua中的控制结构
Lua提供了一组传统的.小巧的控制结构,包括用于条件执行的if,用于迭代的while.repeat和for.所有的控制结构都有意个显式的终止符:if.for和while以end作为结尾,repeat以 ...
- Struts2(五)数据校验
一.概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过两种方式来阐述Stru ...
- c++学习笔记—动态内存与智能指针浅析
我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非stat ...