多线程(二)NSThread

一、NSThread优缺点

优点:NSThread是最轻量级的

缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

二、NSThread的使用

  • 创建线程:

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullableid)argument;

- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullableid)argument; //argument:传输给target的唯一参数,也可以是nil

  1. 直接创建线程,并开始执行线程

[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];

  1. 先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息

NSThread* myThread = [[NSThread alloc] initWithTarget:self

selector:@selector(doSomething:)

object:nil];

[myThread start];

  1. 不显式创建线程的方法,Swift中去掉了这个方法,苹果认为 performSelector: 不安全,,,,,

      NSObject *obj;

[obj performSelectorInBackground:@selector(doSomething) withObject:nil];

例子:

- (void)viewDidLoad {

[super viewDidLoad];

//    [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];
    NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/image/pic/item/5366d0160924ab1828b7c95336fae6cd7b890b34.jpg"];
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:url];
    [thread start];
}

- (void)downloadImage:(NSString *)url {
    NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    UIImage *image = [[UIImage alloc]initWithData:data];
    if(image == nil){
       
    }else{
        [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
    }
}

- (void)updateUI:(UIImage *)image {
    self.iconView.image = image;

}

  1. 更新其他线程

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait

  1. 常用属性

//取消线程
    - (void)cancel;
    //启动线程
    - (void)start;
    //判断某个线程的状态的属性
    @property (readonly, getter=isExecuting) BOOL executing;
    @property (readonly, getter=isFinished) BOOL finished;
    @property (readonly, getter=isCancelled) BOOL cancelled;
    //设置和获取线程名字
    -(void)setName:(NSString *)n;
    -(NSString *)name;
    //获取当前线程信息
    + (NSThread *)currentThread;
    //获取主线程信息
    + (NSThread *)mainThread;
    //使当前线程暂停一段时间,或者暂停到某个时刻
    + (void)sleepForTimeInterval:(NSTimeInterval)time;

+ (void)sleepUntilDate:(NSDate *)date;

时间: 2024-11-01 09:57:45

多线程(二)NSThread的相关文章

多线程(二) 线程的安全隐患

有了多线程就有了资源竞争,当多个线程对同一资源进行操作时就容易出现安全隐患. 下面举一个卖票的例子来说明线程的安全隐患 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 @interface ViewController () @property (assign, nonatomic)NSInteger ticke

多线程 pthread + NSThread

多线程 pthread + NSThread pthread (C语言) · 规律: C语言中的数据类型一般都是以 _t或者Ref结尾 创建C语言的对象, 一般都用cretae#import <pthread/pthread.h>- (IBAction)btnOnClick:(id)sender { // 1.创建子线程/* 第1个参数:线程代号 (现场对象) 第2个参数:线程的属性 第3个参数:子线程需要执行的操作(调用的方法) void *(*)(void *) 返回值 (*指针名称)参数

多线程之-NSThread

多线程之-NSThread 2015.1.3 介绍NSThread之前先介绍一下pthread,仅供了解,一般在开发中用不到的 pthread(了解) 类型: C语言中类型的结尾通常 _t/Ref,而且不需要使用 * /* 参数说明: 1. pthread_t *restrict 线程代号的地址 2. const pthread_attr_t *restrict 线程的属性 3. 调用函数的指针 - void *(*)(void *) - 返回值 (函数指针)(参数) - void * 和 OC

iOS多线程-NSThread

本文转载自嘟嘟夜未央的博文:http://www.cnblogs.com/huluo666/p/3645889.html,修改了部分代码和贴图,如有侵犯版权请与我联系删除. 多线程这个概念的接触是蛮早的时候了,当时还是单核单CPU的时候,Thread这个概念已经出现了,当时比较流行的方案是时间片轮流,线程可以优先级抢占,但一次只能运行一个线程,实际上多线程是不能真正并行处理的,只是宏观上表现的多线程在齐头并进.现在硬件进步了很多,多核的CPU时代来临了,于是线程开始了真正意义上的并行处理,多线程

多线程二(GCD)代码笔记

// // TWFXViewController.h // Demo_GCD // // Created by Lion User on 12-12-11. // Copyright (c) 2012年 Lion User. All rights reserved. // #import <UIKit/UIKit.h> @interface TWFXViewController : UIViewController @property (retain, nonatomic) IBOutlet

iOS开发多线程网络———NSThread

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); iOS开发多线程网络———NS

学习IOS开发网络多线程篇--NSThread/GCD/

NSThread:利用NSThread创建和启用一个线程 1. NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];,调用后调用[thread start]; 2. 创建线程后自动启动线程 ,[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 3. 隐式创建

python多线程(二)

原文:http://blog.sina.com.cn/s/blog_4b5039210100esc1.html 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时候,只有一个程序在CPU中运行.同样,虽然python解释器可以“运行”多个线程,但在任意时刻,只有一个线程在解释器中运行. 对pyt

IOS开发 多线程编程 - NSThread

每个iOS应用程序都有个专门用来更新显示UI界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程堵塞,增加运行效率的最佳方法 iOS支持多个层次的多线程编程,层次越高的抽象程度越高,使用也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程方法: 1.Thread :是三种方法里面相对轻量级的,

objective-c开发——多线程(NSThread)

多线程是什么? 首先,什么是线程,你可以理解为,线程是进程的进程. 进程是神马? 进程是计算机里的一个一个小任务. 我这么跟你说吧. 我们的主程序是一根筋的笨蛋,一个时间内只能干一件事儿.并且,所有操作UI控件的程序,只能由主线程来完成. 但是,例如,访问网络这种耗时.费力,还可能卡死的事情,如果放在主程序中,那用户体验可是太不好了, 因为,这事儿没完,后面的事情就干不了. 主程序就是这样,一件事情干完了,再干另一件事情.这事儿没干完,就等着. 那用户就在这儿等着?你有个进度条还好,要是连进度条