概念:
//什么是进程?
//1.进程是指在系统中正在运行的一个应用程序//2.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
//什么是线程?
//1.1个进程想要执行任务,必须得有线程(每个进程至少要有1条线程)
//2.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行
//什么是多线程
//1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同任务
//多线程原理
//同一时间,CPU只能处理一条线程,只有一条线程在工作(执行)。多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
//如果线程非常非常多,会发生么情况?
//CPU会在n多线程之间调度,CPU会累死,消耗大量的CPU资源
//多线程的优点
//1.能适当提高程序的执行效率
//2.能适当提高资源利用率(CPU,内存利用率)
//多线程的缺点
//1.开启大量的线程,占用大量的内存空间,降低程序的性能
//2.线程越多,CPU在调度线程上的开销就越大
//3.程序设计更加复杂,比如线程之间的通信,线程的资源共享
//什么是主线程
//一个IOS程序运行后,默认会开启一条线程,成为“主线程”或“UI线程”
//主线程的主要作用
//1.显示\刷新UI界面
//2.处理UI事件(比如点击事件,滑动事件,拖拽事件等)
//主线程的使用注意
//1.别将比较耗时的操作放到主线程中
//2.耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验
//IOS中多线程的实现方案
//1.NSThread
//使用起来更加面向对象
//简单易用,可直接操作线程对象
//OC语言
//程序猿管理线程的生命周期
//偶尔使用 使用里面的个别方法
//
//2.GCD
//意在代替NSThread等线程技术
//充分利用设备的多核
//C语言
//自动管理线程的生命周期
//经常使用
//
//3.NSOperation
//基于GCD(底层是GCD)
//比GCD多了一些简单实用的功能
//实用更加面向对象
//自动管理线程的生命周期
//经常使用
1.NSThread
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UISwitch *switchButton = [[UISwitch alloc] initWithFrame:CGRectMake(0, 200, 70, 30)];
[self.view addSubview:switchButton];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 250, 320, 100)];
textView.editable = NO;
[textView setFont:[UIFont systemFontOfSize:30]];
[textView setText:@"nnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsafnnasdjfasjdfsjdfsdafdsfdsaf"];
[self.view addSubview:textView];
}
- (void)loadData:(NSString *)str
{
//获取当前线程
NSLog(@"下载东西 ----- %@",[NSThread currentThread]);
//获取主线程
NSLog(@"拿到主线程 ---- %@",[NSThread mainThread]);
NSLog(@"str --- %@",str);
// //睡眠3秒
// [NSThread sleepForTimeInterval:3];
//睡眠到一个NSDate为止
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3];
[NSThread sleepUntilDate:date];
for (int i=0; i<10000; i++) {
NSLog(@"------------ %d",i);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self createThread1];
}
//穿件线程方法3 隐式创建线程
- (void)createThread3
{
//不会创建线程
// [self performSelector:@selector(loadData:) withObject:@"performSelector"];
[self performSelectorInBackground:@selector(loadData:) withObject:@"performSelectorInBackground"];
}
//创建线程方法2 创建线程自动启动
- (void)createThread2
{
[NSThread detachNewThreadSelector:@selector(loadData:) toTarget:self withObject:@"detachNewThreadSelector"];
}
//创建线程方法1 创建线程然后启动线程
- (void)createThread1
{
//创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadData:) object:@"NSThread"];
thread.name = @"下载线程";
//启动线程
[thread start];
}