你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 懂得iOS多線程運用的開辟和線程的創立辦法

懂得iOS多線程運用的開辟和線程的創立辦法

編輯:IOS開發綜合

1、過程和線程
1.甚麼是過程
 
過程是指在體系中正在運轉的一個運用法式
每一個過程之間是自力的,每一個過程均運轉在其公用且受掩護的內存空間內

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452497.png (547×183)

好比同時翻開QQ、Xcode,體系就會分離啟動2個過程
經由過程“運動監督器”可以檢查Mac體系中所開啟的過程
 
2.甚麼是線程
1個過程要想履行義務,必需得有線程(每1個過程至多要有1條線程)
線程是過程的根本履行單位,一個過程(法式)的一切義務都在線程中履行
好比應用酷狗播放音樂、應用迅雷下載片子,都須要在線程中履行

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452423.png (592×248)

3.線程的串行
 
1個線程中義務的履行是串行的
假如要在1個線程中履行多個義務,那末只能一個一個地按次序履行這些義務
也就是說,在統一時光內,1個線程只能履行1個義務
好比在1個線程中下載3個文件(分離是文件A、文件B、文件C)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452453.png (604×244)

2、多線程
 
1.甚麼是多線程
1個過程中可以開啟多條線程,每條線程可以並行(同時)履行分歧的義務
過程 ->車間,線程->車間工人
多線程技巧可以進步法式的履行效力
好比同時開啟3條線程分離下載3個文件(分離是文件A、文件B、文件C)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452417.png (1259×442)

2.多線程的道理
 
統一時光,CPU只能處置1條線程,只要1條線程在任務(履行)
多線程並發(同時)履行,實際上是CPU疾速地在多條線程之間調劑(切換)
假如CPU調劑線程的時光足夠快,就形成了多線程並發履行的假象
思慮:假如線程異常異常多,會產生甚麼情形?
CPU會在N多線程之間調劑,CPU會累逝世,消費年夜量的CPU資本
每條線程被調劑履行的頻次會下降(線程的履行效力下降)
 
3.多線程的優缺陷
 
多線程的長處
能恰當進步法式的履行效力
能恰當進步資本應用率(CPU、內存應用率)
 
多線程的缺陷
開啟線程須要占用必定的內存空間(默許情形下,主線程占用1M,子線程占用512KB),假如開啟年夜量的線程,會占用年夜量的內存空間,下降法式的機能
線程越多,CPU在調劑線程上的開支就越年夜
法式設計加倍龐雜:好比線程之間的通訊、多線程的數據同享
 
4.多線程在IOS開辟中的運用
主線程:一個IOS法式運轉後,默許會開啟1條線程,稱為“主線程”或“UI線程”
主線程的重要感化
顯示\刷新UI界面
處置UI事宜(好比點擊事宜、轉動事宜、拖拽事宜等)
 
 
主線程的應用留意:別將比擬耗時的操作放到主線程中。
耗時操作會卡住主線程,嚴重影響UI的流利度,給用戶一種“卡”的壞體驗
 
5.代碼示例

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452427.png (664×440)


//
//  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

履行後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452495.png (767×200)

解釋:當點擊履行的時刻,textView點擊無呼應。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452415.png (320×498)

履行剖析:期待主線程串行履行。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452457.png (1015×669)

開啟子線程。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452479.png (1316×691)

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

完成後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452459.png (320×501)

打印成果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452427.png (868×187)

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,打印成果為:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452425.png (867×338)

挪用線程2

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452433.png (863×213)

挪用線程3

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452462.png (880×224)

【懂得iOS多線程運用的開辟和線程的創立辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved