1、過程和線程
1.甚麼是過程
過程是指在體系中正在運轉的一個運用法式
每一個過程之間是自力的,每一個過程均運轉在其公用且受掩護的內存空間內
好比同時翻開QQ、Xcode,體系就會分離啟動2個過程
經由過程“運動監督器”可以檢查Mac體系中所開啟的過程
2.甚麼是線程
1個過程要想履行義務,必需得有線程(每1個過程至多要有1條線程)
線程是過程的根本履行單位,一個過程(法式)的一切義務都在線程中履行
好比應用酷狗播放音樂、應用迅雷下載片子,都須要在線程中履行
3.線程的串行
1個線程中義務的履行是串行的
假如要在1個線程中履行多個義務,那末只能一個一個地按次序履行這些義務
也就是說,在統一時光內,1個線程只能履行1個義務
好比在1個線程中下載3個文件(分離是文件A、文件B、文件C)
2、多線程
1.甚麼是多線程
1個過程中可以開啟多條線程,每條線程可以並行(同時)履行分歧的義務
過程 ->車間,線程->車間工人
多線程技巧可以進步法式的履行效力
好比同時開啟3條線程分離下載3個文件(分離是文件A、文件B、文件C)
2.多線程的道理
統一時光,CPU只能處置1條線程,只要1條線程在任務(履行)
多線程並發(同時)履行,實際上是CPU疾速地在多條線程之間調劑(切換)
假如CPU調劑線程的時光足夠快,就形成了多線程並發履行的假象
思慮:假如線程異常異常多,會產生甚麼情形?
CPU會在N多線程之間調劑,CPU會累逝世,消費年夜量的CPU資本
每條線程被調劑履行的頻次會下降(線程的履行效力下降)
3.多線程的優缺陷
多線程的長處
能恰當進步法式的履行效力
能恰當進步資本應用率(CPU、內存應用率)
多線程的缺陷
開啟線程須要占用必定的內存空間(默許情形下,主線程占用1M,子線程占用512KB),假如開啟年夜量的線程,會占用年夜量的內存空間,下降法式的機能
線程越多,CPU在調劑線程上的開支就越年夜
法式設計加倍龐雜:好比線程之間的通訊、多線程的數據同享
4.多線程在IOS開辟中的運用
主線程:一個IOS法式運轉後,默許會開啟1條線程,稱為“主線程”或“UI線程”
主線程的重要感化
顯示\刷新UI界面
處置UI事宜(好比點擊事宜、轉動事宜、拖拽事宜等)
主線程的應用留意:別將比擬耗時的操作放到主線程中。
耗時操作會卡住主線程,嚴重影響UI的流利度,給用戶一種“卡”的壞體驗
5.代碼示例
//
// YYViewController.m
// 01-壅塞主線程
//
// Created by apple on 14-6-23.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import "YYViewController.h"
@interface YYViewController ()
- (IBAction)btnClick;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
//按鈕的點擊事宜
- (IBAction)btnClick {
//1.獲得以後線程
NSThread *current=[NSThread currentThread];
//2.應用for輪回履行一些耗時操作
for (int i=0; i<10000; i++) {
//3.輸入線程
NSLog(@"btnClick---%d---%@",i,current);
}
}
@end
履行後果:
解釋:當點擊履行的時刻,textView點擊無呼應。
履行剖析:期待主線程串行履行。
開啟子線程。
3、創立和啟動線程簡略解釋
一個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種創立線程方法的優缺陷
長處:簡略快捷
缺陷:沒法對線程停止更具體的設置
4、多線程代碼示例
1.應用陳舊的方法創立
//
// YYViewController.m
//
//
// Created by apple on 14-6-23.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import "YYViewController.h"
#import <pthread.h>
@interface YYViewController ()
- (IBAction)btnClick;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
//按鈕的點擊事宜
- (IBAction)btnClick {
//1.獲得以後線程
NSThread *current=[NSThread currentThread];
//主線程
NSLog(@"btnClick----%@",current);
//2.應用for輪回履行一些耗時操作
pthread_t thread;
pthread_create(&thread, NULL, run, NULL);
}
//c說話函數
void *run(void *data)
{
//獲得以後線程,是新創立出來的線程
NSThread *current=[NSThread currentThread];
for (int i=0; i<10000; i++) {
NSLog(@"btnClick---%d---%@",i,current);
}
return NULL;
}
//多個線程,點擊按鈕履行按鈕挪用辦法的時刻,主線程沒有被壅塞
@end
完成後果:
打印成果:
2.應用NSThread創立線程
//
// YYViewController.m
//
//
// Created by apple on 14-6-23.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import "YYViewController.h"
#import <pthread.h>
@interface YYViewController ()
- (IBAction)btnClick;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
//按鈕的點擊事宜
- (IBAction)btnClick {
//1.獲得以後線程
NSThread *current=[NSThread currentThread];
//主線程
NSLog(@"btnClick----%@",current);
//獲得主線程的別的一種方法
NSThread *main=[NSThread mainThread];
NSLog(@"主線程-------%@",main);
//2.履行一些耗時操作
[self creatNSThread];
// [self creatNSThread2];
// [self creatNSThread3];
}
/**
* NSThread創立線程方法1
* 1> 先創立初始化線程
* 2> start開啟線程
*/
-(void)creatNSThread
{
NSThread *thread=[[NSThread alloc]initWithtarget:self selector:@selector(run:) object:@"線程A"];
//為線程設置一個稱號
thread.name=@"線程A";
//開啟線程
[thread start];
NSThread *thread2=[[NSThread alloc]initWithtarget:self selector:@selector(run:) object:@"線程B"];
//為線程設置一個稱號
thread2.name=@"線程B";
//開啟線程
[thread2 start];
}
/**
* NSThread創立線程方法2
*創立完線程直接(主動)啟動
*/
-(void)creatNSThread2
{
// NSThread *thread=[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"創立完線程直接(主動)啟動"];
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"創立完線程直接(主動)啟動"];
}
/**
* NSThread創立線程方法3
* 隱式創立線程, 而且直接(主動)啟動
*/
-(void)creatNSThread3
{
//在後台線程中履行===在子線程中履行
[self performSelectorInBackground:@selector(run:) withObject:@"隱式創立"];
}
-(void)run:(NSString *)str
{
//獲得以後線程
NSThread *current=[NSThread currentThread];
//打印輸入
for (int i=0; i<10; i++) {
NSLog(@"run---%@---%@",current,str);
}
}
@end
挪用線程1,打印成果為:
挪用線程2
挪用線程3
【懂得iOS多線程運用的開辟和線程的創立辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!