进程:单个cpu同一时刻只能运行一个进程,单核的cpu可以双开QQ和网页是因为时间碎片化的方法,就是不断来回切换来达到假的多个进程同时进行的效果。
线程:一个进程可以包含多个线程,就是一个程序可以有多个功能一样。
一个程序运行的时候会申请一个内存,然后所有的线程都是共有这个内存的。但是功能都占有一部分内存,有些内存只准一个线程访问,只时候就要加锁。
并行:按照字面意思就是一起执行,指的是同一时刻同时执行多个进程,需要多核。
并发:指同时发生,这是用了时间碎片化,给人的感觉像是同时发生,其实是有间隔的。
锁分为:(1)互斥锁(Mutex),什么特征都没有,不管什么钥匙都能开,只要开了关了就好了。只有一把,是最基本的锁。适用于只能一个线程访问的。
(2)信号量(Semphore):一个内存区域可以有多个线程访问,但是访问的个数有限制,这时候就要用信号量了,就是互斥锁的升级版。
线程池:就是放线程的池子,就是开辟一块内存放入多个线程,使用的时候就拿出来,可以增加效率。不用了就放回去。
同步异步的主要差别就是是否需要在原地等待和接受任务完成信号的方式不同。
同步:就是傻傻的自己呆在原地等任务完成然后自己接受信号。
异步:就是有个通知机制,系统会发个通知告诉它任务完成了。
阻塞:就是只有当前任务完成了他才能继续下面的任务。
非阻塞:就是任务还没完成,他就继续往下执行了,他可以组别的任务。
多线程:
一个程序有一个主线程,所有会阻碍主线程的操作,都要放到多线程里面去进行,比如(网络访问)。
线程的五种状态:
(1)新建(new) 新建任务的时候会自动新建一些线程的
(2)就绪 (runnable)就是线程放在了线程池中,随时可以调用的。等待获得CPU使用权。
(3)运行 (running) 就是线程开始运行了,执行代码了,就是获得了CPU使用权。
(4)阻塞 (block) 某种原因放弃了使用权,只有先进入就绪次才能继续运行。
(5)死亡 (dead) 线程结束或者程序退出。
cancle和exit的区别:
1.cancel的作用只是将当前线程对象的cancelled属性置成YES,标识此线程即将被终结。
2.exit的作用是终结当前线程。结束当前线程的生命周期,线程中剩余的代码将不再执行。
3.在设计程序程序应该设计一个轮询的机制(cancellation),一直在探测当前线程的cancelled属性,如果此属性为YES,就调用exit方法来终结当前线程。
*/
#import "ViewController.h"
#import "CustomThread.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.创建线程对象,并调用start方法加入线程池,并使其处于runnable状态。
NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(thread1Method) object:nil];
[thread1 start];
//在主线程中调用cancel方法来把多线程的cancelled属性置成YES
[self performSelector:@selector(cancelMultiThread:) withObject:thread1 afterDelay:1];//这个方法是把这个任务放到主线程中,然后把这个cancelled属性在主线程中进行改变
// //2.使用NSThread的类方法来创建多线程对象,并自动调用start
// [NSThread detachNewThreadSelector:@selector(thread1Method) toTarget:self withObject:nil];
//
// //3.使用NSThreadPerformAdditions类目中定义的方法来创建多线程,并开启
// [self performSelectorInBackground:@selector(thread1Method) withObject:nil];
//
//
// //4.自定义线程类。
// CustomThread *thread = [[CustomThread alloc] init];
//
// //start方法不能重复调用。
// [thread start];
// // [thread start];
// //[thread main];//不能调用这个方法,这个方式是直接的方法调用,不是从main进入线程
}
- (void)thread1Method {
NSLog(@"threadPriority:%lf", [NSThread threadPriority]);//打印当前线程优先级默认0.5000
//假设当前多线程在处理一个耗时的任务
[NSThread sleepForTimeInterval:2];//线程休眠时间
if ([NSThread currentThread].isCancelled) {
NSLog(@"thread exit");
//exit的作用:退出当前线程,在退出之前会发送NSThreadWillExitNotification
//exit方法没有作在线程中分配资源的清理工作,因此应该在此方法调用之前来作资源的相关清理工作。
[NSThread exit];
}
if (![[NSThread currentThread] isMainThread]) {
NSLog(@"当前线程是多线程");
}
}
- (void)cancelMultiThread:(NSThread *)thread {
//只是将thread对象的cancelled属性置成YES
[thread cancel];
}