亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

多線程

2019-11-09 18:43:04
字體:
來源:轉載
供稿:網友

一個運行的程序就是一個進程或者叫做一個任務

一個進程至少包含一個線程,線程是程序的執行流

iOS 程序啟動時,在創建一個進程的同事,會開始運行一個程序,該程序被稱作主線程

主線程是其他線程最終的父線程,所有界面的顯示操作必須在主線程進行!?。?!

后臺線程無法更新UI界面和響應用戶點擊事件

系統中的每一個進程都是有自己獨立的虛擬內存空間,而同一個進程中的多個線程則公用進程的內存空間

每創建一個新的線程,都會消耗一定內存的CPU時間

當多線程對同一個資源出現爭奪的時候需要注意線程安全問題

線程的使用不是無節制的 :iOS 主線程的堆棧大小是1M,從第二個線程開始就是512KB,這些數值不能通過編譯器開關和線程API函數更改 

只有主線程有直接修改UI的能力

 

一、NSObject多線程方法

1、[NSThread currentThread]; 可以返回當前運行的線程

      num = 1 說明是主線程

      在任務多線程技術中,均可以使用此方法查看當前的線程情況。

2、新建后臺線程,調度任務

     [selfperformSelectorInBackground:@selector(bgTask)withObject:nil];

     使用performSelectorInBackground是可以修改UI的,不是強烈不建議這樣使用。

3、更新界面

     使用performSelectorOnMainThread可以在主線程上執行任務。

     提示:NSObject對象均可以調用此方法。

4、內存管理

     線程任務要包在@autoreleasepool(自動釋放池)中,否則容易引起內存泄露,而且非常難發現。

5、總結:使用簡單,量級輕,不能控制線程的執行順序

例如:

@implementation ViewController

- (void)viewDidLoad {

    [superviewDidLoad];

    UIButton *button1 =[UIButtonbuttonWithType:UIButtonTypeCustom];

    button1.backgroundColor =[UIColorredColor];

    button1.frame =CGRectMake(50,50, 100,50);

    [button1 setTitle:@"耗時操作"forState:UIControlStateNormal];

    [button1 addTarget:selfaction:@selector(buttton1)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:button1];

    UIButton *button2 =[UIButtonbuttonWithType:UIButtonTypeCustom];

    button2.backgroundColor =[UIColorredColor];

    button2.frame =CGRectMake(50,150, 100,50);

    [button2 setTitle:@"普通操作"forState:UIControlStateNormal];

    [button2 addTarget:selfaction:@selector(button2)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:button2];

}

-(void)buttton1

{

    //后臺耗時操作

    //performSelectorInBackground會創建一個后臺線程,并在該線程中執行調用的方法

//    performSelectorInBackground是可以修改UI的但是強烈不建議使用

    [selfperformSelectorInBackground:@selector(bgTask)withObject:nil];

}

-(void)button2

{

}

-(void)bgTask

{

    @autoreleasepool {

        for (int i =0; i  < 30000000; i++) {

            NSLog(@"%d",i);

        }

        //在主線程中修改所需要的操作或界面內容;withObject:所需要傳遞的參數

        [selfperformSelectorOnMainThread:@selector(change)withObject:nilwaitUntilDone:YES];

    }

}

-(void)change

{

}

二、NThread

 1、類方法

detachNewThreadSelector直接啟動線程,調用選擇器方法

2、成員方法

initWithTarget需要使用start方法才能啟動實例化出來的線程

優點:簡單

缺點:控制線程的生命周期比較困難

           控制并發線程數

           先后順序困難

例如:

#import "ViewController.h"

@interface ViewController ()

@PRoperty(nonatomic,strong)NSSet *imageViewSet;

@end

@implementation ViewController

-(void)setUpUI{

    //實例化圖像視圖集合

    NSMutableSet *imageSet = [NSMutableSetsetWithCapacity:28];

    NSInteger w =self.view.frame.size.width/8;

    NSInteger h =self.view.frame.size.height/8;

    for (int row =0; row < 7; row++) {

        for (int col =0; col < 4; col++) {

            //計算圖片的位置

            NSInteger x = col * w;

            NSInteger y = row * h;

            UIImageView *imageview =[[UIImageViewalloc]initWithFrame:CGRectMake(x, y, w, h)];

            //順序填充圖片

            NSInteger num = (row *4 * col) % 17 +1;

            NSString *imageName =[NSStringstringWithFormat:@"圖片名稱%ld",num];

            UIImage *image = [UIImageimageNamed:imageName];

            [imageview setImage:image];

            [self.viewaddSubview:imageview];

            [imageSet addObject:imageview];

            

        }

    }

    self.imageViewSet = imageSet;

    //添加按鈕

    UIButton *button =[UIButtonbuttonWithType:UIButtonTypeRoundedRect];

    [button setFrame:CGRectMake(110,self.view.frame.size.height - 80, 100,50)];

    [button setTitle:@"刷新圖片"forState:UIControlStateNormal];

    [button addTarget:selfaction:@selector(click)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:button];

    

}

-(void)click

{

    [selfthreadLoad];

}

#pragma mark - NSThread方法

-(void)threadLoadImage:(UIImageView *)imageView{

    @autoreleasepool {

        NSInteger num =arc4random_uniform(17) +1;

        NSString *imageName = [NSStringstringWithFormat:@"圖片名稱%ld",num];

        UIImage *image =[UIImageimageNamed:imageName];

        //主線程更新UI

        [imageView performSelectorOnMainThread:@selector(setImage:)withObject:image waitUntilDone:YES];

      

    }

   

}

-(void)threadLoad

{

    for (UIImageView *imagevin self.imageViewSet) {

        //新建線程調用threadLoadImage方法

//        [NSThread detachNewThreadSelector:@selector(threadLoadImage:) toTarget:self withObject:imagev];

        NSThread *thread = [[NSThreadalloc]initWithTarget:selfselector:@selector(threadLoadImage:)object:imagev];

        //啟動線程

        [thread start];

    }

}

- (void)viewDidLoad {

    [superviewDidLoad];

    

    [selfsetUpUI];

    

}

三、NSOperation

1、NSOperation的兩個子類NSInvocationOperation,NSBlockOperation

例如:

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong)NSSet *imageViewSet;

@property(strong,nonatomic)NSOperationQueue *queue;

@end

@implementation ViewController

-(void)setUpUI{

    //實例化圖像視圖集合

    NSMutableSet *imageSet = [NSMutableSetsetWithCapacity:28];

    NSInteger w =self.view.frame.size.width/8;

    NSInteger h =self.view.frame.size.height/8;

    for (int row =0; row < 7; row++) {

        for (int col =0; col < 4; col++) {

            //計算圖片的位置

            NSInteger x = col * w;

            NSInteger y = row * h;

            UIImageView *imageview =[[UIImageViewalloc]initWithFrame:CGRectMake(x, y, w, h)];

            //順序填充圖片

            NSInteger num = (row *4 * col) % 17 +1;

            NSString *imageName =[NSStringstringWithFormat:@"圖片名稱%ld",num];

            UIImage *image = [UIImageimageNamed:imageName];

            [imageview setImage:image];

            [self.viewaddSubview:imageview];

            [imageSet addObject:imageview];

            

        }

    }

    self.imageViewSet = imageSet;

    //添加按鈕

    UIButton *button =[UIButtonbuttonWithType:UIButtonTypeRoundedRect];

    [button setFrame:CGRectMake(110,self.view.frame.size.height - 80, 100,50)];

    [button setTitle:@"刷新圖片"forState:UIControlStateNormal];

    [button addTarget:selfaction:@selector(click)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:button];

    

    

}

-(void)click

{

   // [selfoperationLoad];

    [selfoperationBlockLoad];

}

#pragma mark - NSOperation方法

-(void)operationBlockLoad

{

    for (UIImageView *imagevin self.imageViewSet) {

    NSBlockOperation *op = [NSBlockOperationblockOperationWithBlock:^{

        [selfoperationLoadImage:imagev];

    }];

        [self.queueaddOperation:op];

    }

}

-(void)operationLoadImage:(UIImageView *)imageView{

    @autoreleasepool {

        NSInteger num =arc4random_uniform(17) +1;

        NSString *imageName = [NSStringstringWithFormat:@"圖片名稱%ld",num];

        UIImage *image =[UIImageimageNamed:imageName];

        //主線程更新UI

      [[NSOperationQueuemainQueue]addOperationWithBlock:^{

          [imageView setImage:image];

      }];

      

    }

   

}

-(void)operationLoad

{

    //隊列可以設置同時并發線程的數量

    [self.queuesetMaxConcurrentOperationCount:3];

    for (UIImageView *imagevin self.imageViewSet) {

        NSInvocationOperation *op =[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(operationLoadImage:)object:imagev];

        //如果直接調用start,實在主線程隊列上運行的,不會開啟新的線程

        [op start];

        //Invocation添加到隊列,一添加到隊列,就會開啟新的線程執行任務

        [self.queueaddOperation:op];

    }

}

#pragma mark - NSOperation操作之間的順序

-(void)operationDemo

{

    NSBlockOperation *op1 = [NSBlockOperationblockOperationWithBlock:^{

        

    }];

    NSBlockOperation *op2 = [NSBlockOperationblockOperationWithBlock:^{

        

    }];

    NSBlockOperation *op3 = [NSBlockOperationblockOperationWithBlock:^{

        

    }];

    //Dependency依賴依賴關系可以多重依賴

    [op2 addDependency:op1];

    [op3 addDependency:op2];

    [self.queueaddOperation:op3];

    [self.queueaddOperation:op1];

    [self.queueaddOperation:op2];

}

- (void)viewDidLoad {

    [superviewDidLoad];

    

    [selfsetUpUI];

    //實例化操作隊列

    self.queue = [[NSOperationQueuealloc]init];

    

}

四、GCD

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong)NSSet *imageViewSet;

@end

@implementation ViewController

-(void)setUpUI{

    //實例化圖像視圖集合

    NSMutableSet *imageSet = [NSMutableSetsetWithCapacity:28];

    NSInteger w =self.view.frame.size.width/8;

    NSInteger h =self.view.frame.size.height/8;

    for (int row =0; row < 7; row++) {

        for (int col =0; col < 4; col++) {

            //計算圖片的位置

            NSInteger x = col * w;

            NSInteger y = row * h;

            UIImageView *imageview =[[UIImageViewalloc]initWithFrame:CGRectMake(x, y, w, h)];

            //順序填充圖片

            NSInteger num = (row *4 * col) % 17 +1;

            NSString *imageName =[NSStringstringWithFormat:@"圖片名稱%ld",num];

            UIImage *image = [UIImageimageNamed:imageName];

            [imageview setImage:image];

            [self.viewaddSubview:imageview];

            [imageSet addObject:imageview];

            

        }

    }

    self.imageViewSet = imageSet;

    //添加按鈕

    UIButton *button =[UIButtonbuttonWithType:UIButtonTypeRoundedRect];

    [button setFrame:CGRectMake(110,self.view.frame.size.height - 80, 100,50)];

    [button setTitle:@"刷新圖片"forState:UIControlStateNormal];

    [button addTarget:selfaction:@selector(click)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:button];

    

    

}

-(void)click

{

    [selfgcdLoad];

    

}

#pragma mark - GCD加載圖像

-(void)gcdLoad

{

    //派發dispatch異步async執行,并發執行

    //PRIORITY優先級,一般選擇默認的即可

    //獲取全局隊列

    dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

           for (UIImageView *imagevin self.imageViewSet) {

               dispatch_async(queue, ^{

                   NSInteger num =arc4random_uniform(17) +1;

                   NSString *imageName = [NSStringstringWithFormat:@"圖片名稱%ld",num];

                   UIImage *image =[UIImageimageNamed:imageName];

                   //設置圖像,在主線程隊列設置UI

                   dispatch_async(dispatch_get_main_queue(), ^{

                       [imagev setImage:image];

                   });

               });

        }

  

}

#pragma mark - GCD

-(void)gcdDemo

{

    //全局隊列中調用異步任務開發時候不用考慮并發線程數量問題

//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//    dispatch_async(queue, ^{

//        

//    });

    //    dispatch_async(queue, ^{

    //

    //    });

    //    dispatch_async(queue, ^{

    //

    //    });

    //串行隊列,需要創建,不能夠get

    dispatch_queue_t queue =dispatch_queue_create("myQUeue",DISPATCH_QUEUE_SERIAL);

       dispatch_async(queue, ^{

    

        });

       dispatch_async(queue, ^{

        

       });

       dispatch_async(queue, ^{

        

       });

    

}

- (void)viewDidLoad {

    [superviewDidLoad];

    

    [selfsetUpUI];

    

}

@end


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品400部情侣激情| 2018日韩中文字幕| 中文字幕日本精品| 亚洲欧美日韩区| 久久久久久久久久久av| 精品中文字幕在线观看| 国产一区在线播放| 国产免费亚洲高清| 在线精品播放av| 亚洲欧洲日产国产网站| 欧美大片在线看| 日本成熟性欧美| 欧美日韩国产综合新一区| 国产精品精品视频一区二区三区| 国产精品欧美一区二区三区奶水| 国产精品欧美久久久| 91手机视频在线观看| 色妞在线综合亚洲欧美| 国产精品九九久久久久久久| 自拍亚洲一区欧美另类| 91av在线视频观看| 欧美日韩国产区| 日韩激情视频在线| 91最新国产视频| 91网站免费观看| 欧美亚洲第一区| 精品视频在线导航| 国产免费一区二区三区在线能观看| 久久久国产视频| 日韩av一区二区在线| 日韩精品中文字幕视频在线| 国产精品久久久久久久午夜| 亚洲精品色婷婷福利天堂| 久久精品男人天堂| 日韩中文综合网| 亚洲乱码av中文一区二区| 亚洲片av在线| 欧美一级片免费在线| 不卡毛片在线看| 日韩欧美亚洲范冰冰与中字| 日韩精品视频在线| 久久久999精品| 国产成人高潮免费观看精品| 98午夜经典影视| 亚洲国产精品yw在线观看| 亚洲成年网站在线观看| 福利一区视频在线观看| 欧美人成在线视频| 国产福利成人在线| 久久91亚洲精品中文字幕奶水| 一区二区日韩精品| 亚洲成人久久久久| 亚洲一区国产精品| 中文字幕亚洲欧美日韩2019| 日av在线播放中文不卡| 欧美精品国产精品日韩精品| 成人在线视频网站| 成人午夜小视频| 97精品国产97久久久久久免费| 91在线观看免费高清| 欧美日韩国产影院| 久久久国产精品免费| 最近2019年手机中文字幕| 久久男人资源视频| 久久久精品一区二区| 九九久久综合网站| 91啪国产在线| 欧美大成色www永久网站婷| 成人自拍性视频| 亚洲电影免费观看高清完整版| 2019av中文字幕| 日韩精品视频免费| 欧美激情国产高清| 成人在线播放av| 亚洲福利在线观看| 中文字幕精品一区二区精品| 日本一欧美一欧美一亚洲视频| 国内精品久久久久影院优| 91地址最新发布| 国产精品福利观看| 亚洲欧美制服另类日韩| 久久黄色av网站| 日韩av在线看| 日韩激情片免费| 久久久久久久久久久免费精品| 亚洲午夜国产成人av电影男同| 精品久久香蕉国产线看观看亚洲| 日韩视频在线观看免费| 久久久噜噜噜久久| 亚洲美女免费精品视频在线观看| 成人观看高清在线观看免费| 黑丝美女久久久| 亚洲va欧美va国产综合剧情| 欲色天天网综合久久| 国产欧美一区二区三区在线| 日韩欧美在线视频观看| 日本在线观看天堂男亚洲| 97在线免费观看| 亚洲精品视频久久| 国产在线视频一区| 国产精品国模在线| 亚洲午夜国产成人av电影男同| 欧美成人精品在线| 一区二区福利视频| 黄色精品在线看| 在线视频日本亚洲性| 精品中文字幕在线| 中文字幕久久亚洲| 亚洲第一中文字幕| 国产精品久在线观看| 亚洲精品免费一区二区三区| 日韩欧美a级成人黄色| 日韩av一区二区在线| 日产精品久久久一区二区福利| 成人h视频在线观看播放| 亚洲女人初尝黑人巨大| 中文字幕欧美精品日韩中文字幕| 色无极亚洲影院| 久久影视免费观看| 国产日韩在线免费| 亚洲性视频网址| 精品亚洲一区二区| 国产精品成人aaaaa网站| 一本色道久久88精品综合| 久久综合久久美利坚合众国| 国产精品三级网站| 美女视频黄免费的亚洲男人天堂| 国产视频亚洲视频| 日韩一级裸体免费视频| 另类天堂视频在线观看| 亚洲国产精品电影在线观看| 亚洲国产精品久久| 国产v综合v亚洲欧美久久| 91久久久亚洲精品| 国产精品96久久久久久| 欧美性视频在线| 日韩电影中文字幕av| 中文字幕免费精品一区高清| 亚洲一区中文字幕在线观看| 国产精品欧美久久久| 亚洲第一天堂无码专区| 日韩视频免费在线| 亚洲精品女av网站| 国产91在线高潮白浆在线观看| 蜜臀久久99精品久久久无需会员| 亚洲香蕉成人av网站在线观看| 性亚洲最疯狂xxxx高清| 国产日韩欧美电影在线观看| 国外成人在线直播| 久久精品视频99| 欧美激情xxxx| 亚洲精品美女视频| 一本大道香蕉久在线播放29| 日韩视频中文字幕| 国产亚洲精品久久久久久牛牛| 亚洲自拍在线观看| 日韩性生活视频| 日韩欧中文字幕| 精品在线观看国产| 视频在线观看一区二区| 欧美最猛性xxxxx(亚洲精品)| 久久久天堂国产精品女人| 亚洲精品国产拍免费91在线| 国产精品永久在线|