博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程问题
阅读量:6416 次
发布时间:2019-06-23

本文共 2939 字,大约阅读时间需要 9 分钟。

程序:由源代码生成的可执行应用.

进程:一个正在运行的程序,进程拥有独立运行所需的全部资源;

         由一个或多个线程组成;

         进程只负责资源的调度和分配,线程才是程序的真正执行单元,负责代码的执行

线程:程序中独立运行的代码段.(单线程/多线程)

        只有并行

每个进程,至少包含一个线程,这个线程被称为主线程

主线程在同一时间只能干一件事,主线程尽量只用于展示(iOS中关于UI的添加和刷新必须在主线程中操作)

只有一个主线程的程序,称为单线程程序.

拥有多个线程的程序,称作多线程程序


[NSThread currentThread]获取当前的线程

[NSThread mainThread]获取主线程

[NSThread isMainThread]判断当前线程是否为主线程

****开辟子线程的三种方法

//NSObject开辟子线程

[self performSelectorInBackground: @selector(sayHi)withObject:@"aaa"];

//NSThread手动开辟子线程

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

//让线程开始执行

[thread start];

//取消线程不会真正的取消掉线程,而是标记这个被取消了

[thread cancel];

//NSThread自动的去开辟一个子线程(子线程不能进行增删改的操作)

//使用NSThread自动的开辟一个线程

//不需要手动的开启线程

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

//NSObject中回到主线程去做某些事情

[self performSelectorOnMainThread:@selector(onMainThread)withObject:nil waitUntilDone:YES];


创建NSOperation的方法有两个

//第一个

//通过NSInvocationOperation类来创建一个NSOperation对象(使用初始化方法)

NSInvocationOperation*operation = [[NSInvocationOperation alloc]initWithTarget:selfselector:@selector(hehehe)object:nil];

//第二个

//使用NSBlockOperation类来创建一个NSOperation对象(使用便利构造器的方法)

NSBlockOperation*blockoperation

= [NSBlockOperation blockOperationWithBlock:^{.........}];

***两个方法如果分别单独使用的时候要调用[operation start];

//创建一个队列管理器的方法(两种)

NSOperationQueue是一个队列管理器,可以根据operation任务自己分配线程,自己管理线程的生命周期

//在开发中,不需要管理线程的创建和销毁

//第一种

NSOperationQueue *queue = [[NSOperationQueue alloc]init];

//第二种

//获取系统提供的主队列

NSOperationQueue*mainQueue = [NSOperationQueue mainQueue];

//把operation对象添加到队列管理器当中,不用调用开始的方法

[queue addOperation:blockoperation];

[queue addOperation:operation];

//给两个任务添加依赖关系,这两个任务就会按照依赖关系顺序进行

[operation addDependency:blockoperation];

//最大线程并发数

// maxConcurrentOperationCount表示同时执行任务的最大数量

//即使只执行一个任务,系统有的时候也会开辟多个线程去执行这个任务

quew.maxConcurrentOperationCount= 1;


//GCD获取串行和并行的方法各有俩个

*****创建一个串行的队列

//使用系统提供的一个串行的队列(主队列)

dispatch_queue_tqueue = dispatch_get_main_queue();

//自定义创建一个串行队列

//第一个参数:系统提供一个宏

//第二个参数:系统保留字段0

dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);

*****创建一个并行的队列

//第一种获取系统提供的并行队列

dispatch_queue_t queue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

//自己创建一个并行队列

dispatch_queue_t queue = dispatch_queue_create ("myQueue",DISPATCH_QUEUE_CONCURRENT);


创建分组

//创建分组

dispatch_group_t group = dispatch_group_create();

//创建一个队列()

dispatch_queue_t queue = dispatch_queue_create ("myQueue",DISPATCH_QUEUE_CONCURRENT);

//向分组中添加一个任务

dispatch_group_async(group, queue, ^{

NSLog(@"第一个任务");

});

//向分组中添加结束任务([不要讲结束任务放在第一个位置])

dispatch_group_notify(group, queue, ^{

NSLog(@"我是最后一个");

});

dispatch_group_async(group, queue, ^{

NSLog(@"第二个任务");

});

表示几秒后做某事

//dispatch_after(dispatch_time(DISPATCH_TIME_NOW,

(int64_t)(3.f*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

//NSLog(@"死去时快快快");

//});

重复的向一个队列中添加一系列的任务

dispatch_queue_t queue = dispatch_queue_create(0,

DISPATCH_QUEUE_SERIAL);

 

转载于:https://www.cnblogs.com/hpbb/p/5371222.html

你可能感兴趣的文章
一些常用的网络命令
查看>>
CSP -- 运营商内容劫持(广告)的终结者
查看>>
DIV+CSS命名规范有助于SEO
查看>>
js生成二维码
查看>>
C指针练习
查看>>
web项目buildPath与lib的区别
查看>>
php对redis的set(集合)操作
查看>>
我的友情链接
查看>>
ifconfig:command not found的解决方法
查看>>
js使用正则表达式判断手机和固话格式
查看>>
计算机是怎么存储数字的
查看>>
CentOS改变docker默认存储池大小
查看>>
Docker存储驱动devicemapper介绍和配置
查看>>
win2008作为个人电脑用需要优化的部分
查看>>
vi教程
查看>>
yum 本地源配置问题
查看>>
从Vue.js窥探前端行业
查看>>
Linux chown改变文件所属关系命令
查看>>
android开发——获取手机SD卡的容量
查看>>
django ajax提交 Forbidden CSRF token missing
查看>>