多线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

应用启动后会自动生成一个进程,该应用的大部分操作都是在这个进程完成的,生成一个进程时,后台会自动生成一个主线程,由这个主线程处理或者分配用户与应用之间的交互。所有的线程是在进程的虚拟地址空间中,各个线程是独立的,并都共享进程中的资源。

对于cpu同一时间内,只能执行一条线程,多条线程并行执行(cpu在多条线程之间不断切换,导致认为cpu同时处理多条进程的假象);cpu会因为线程的数量多,导致cpu负担大,导致cpu发热。

多线程的优点:提高程序执行率;能适当提高资源利用率

主线程 显示和刷新UI界面、处理UI事件

子线程 处理耗时的操作[NSThread sleepForTimeInterval:[ta intValue]];、不能用来刷新UI

以下是利用多线程实现多张图片加载

#import "SixImageViewController.h"

#define kUrl @"http://www.pptbz.com/pptpic/UploadFiles_6909/201212/2012120707020691.jpg"

@interface SixImageViewController()

{

    NSMutableArray *threadArray;

    UIImage *image;

}

@end

@implementation SixImageViewController

-(void)viewDidLoad{

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    self.edgesForExtendedLayout = UIRectEdgeNone;

    int imageIndex = 200;

    threadArray = [NSMutableArray array];

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

        for (int y = 0; y < 2; y++) {

            UIImageView *imageView =[[UIImageView alloc]initWithFrame:CGRectMake(10+200*y,10+200*i, 200, 200)];

            imageView.backgroundColor = [UIColor colorWithRed:1.000 green:0.649 blue:0.796 alpha:1.000];

            [self.view addSubview:imageView];

            imageView.tag = imageIndex++;

        }

    }

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

    NSThread *tt = [[NSThread alloc]initWithTarget:self selector:@selector(thread:) object:@(i)];

        [threadArray addObject:tt];

        [tt start];

    }

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    for (NSThread *tt in threadArray) {

        if (tt.isFinished == YES) {

        }else{

            [tt cancel];

        }

    }

}

-(void)thread:(NSNumber *)index{

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kUrl]];

    image = [UIImage imageWithData:data];

     [NSThread sleepForTimeInterval:[index intValue]];

    if ([NSThread currentThread].isCancelled == YES) {

        [NSThread exit];

    }

   [self performSelectorOnMainThread:@selector(upDateUI:) withObject:index waitUntilDone:YES];

}

-(void)upDateUI:(NSNumber *)index{

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

        UIImageView *imageView = [self.view viewWithTag:200 +[index intValue]];

        imageView.image = image;

    }

}

 

@end

 

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)