多线程之Nsthread的使用方法

摘要:
1.NSTthread的基本用法1)创建NSThread的四种方法第一种方法是alloinitwith Features:您需要手动启动线程。您可以获取线程对象并对其进行详细设置//创建线程NSThread*thread=[[NSThreadalloc]initWithTarget:selfselector:@selector(run:)object:@“wending”]//Startthread[thread

一 NSThread的基本使用

1)NSThread创建的四种方式

第一种 创建方式 alloc initwith......

 特点:需要手动启动线程,可以拿到线程对象进行详细设置
  //创建线程  
   NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"wendingding"];
  //启动线程
  [thread start];
    第1个参数:目标对象
    第2个参数:选择器,线程启动要调用哪个方法
    第3个参数:前面方法要接受的参数(最多只能接受一个参数,没有就写nil)

第二种创建线程的方式:分离出一条子线程

特点:自动启动线程,无法对线程进行更详细的设置
 [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"我是分离出来的子线程"];
第1个参数:线程启动调用的方法
第2个参数:目标对象
第3个参宿:传递给调用方法的参数

第三种创建线程的方式: 后台创建

特点:自动启动线程,无法进行更详细的设置
[self performSelectorInBackground:@selector(run:) withObject:@"我是后台线程"];

第四种 自定义
需要自定义NSThread类重写内部方法实现

设置线程的属性

设置线程名称

thread.name = @"线程A"

设置线程的优先级,优先级的取值范围是0.0~1.0 ,1.0表示最高 在不设置状态下 默认是0.5

thread.threadpriority = 1.0;

二 线程状态

线程的各种状态: 新建 就绪 运行 阻塞 死亡
常用的控制线程状态的方法

[NSThread exit]//退出当前线程
[NSThread sleepForTimeInterval:2.0]//阻塞线程
[NSThread sleepUntiDate:[NSDate          dateWithTimeIntervalSinceNow:2.0]]//阻塞线程
注意线程死后不能复生

三 线程安全

01 前提:多个线程访问同一块资源会发生数据安全问题
02 解决方案 :加互斥锁
03 代码 : @synchronized(self){}
04 专业术语: 线程同步
05 原子核非原子属性 (是否对set方法加锁)

四 线程间通信

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
    {
    //    [self download2];
//开启一条子线程来下载图片
[NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];
    }
- (void)downioadImage
{
        //1.确定要下载网络图片的url地址,一个url唯一对应着网络上的一个资源
        NSURL *url = [NSURL URLWithString:@"http://p6.qhimg.com/t01d2954e2799c461ab.jpg"];

        //2.根据url地址下载图片数据到本地(二进制数据
        NSData *data = [NSData dataWithContentsOfURL:url];

        //3.把下载到本地的二进制数据转换成图片
        UIImage *image = [UIImage imageWithData:data];

        //4.回到主线程刷新UI
        //4.1 第一种方式
    //    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];

        //4.2 第二种方式
    //    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

        //4.3 第三种方式
        [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
    }

五 如何计算代码段的执行时间

 //第一种方法
        NSDate *start = [NSDate date];
        //2.根据url地址下载图片数据到本地(二进制数据)
        NSData *data = [NSData dataWithContentsOfURL:url];

        NSDate *end = [NSDate date];
        NSLog(@"第二步操作花费的时间为%f",[end timeIntervalSinceDate:start]);

 //第二种方法
        CFTimeInterval start = CFAbsoluteTimeGetCurrent();
        NSData *data = [NSData dataWithContentsOfURL:url];

        CFTimeInterval end = CFAbsoluteTimeGetCurrent();
        NSLog(@"第二步操作花费的时间为%f",end - start);



文/放肆肆肆(简书作者)
原文链接:http://www.jianshu.com/p/26d0adf9b7aa
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

免责声明:文章转载自《多线程之Nsthread的使用方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL学习随笔--通过实例理解merge ,temptable算法的差异Selenium-Switch--切换浏览器tab/iframe/alart下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue-cli 引入axios及跨域使用

使用 cnpm 安装 axios cnpm install axios --save-dev 安装其他插件的时候,可以直接在 main.js 中引入并 Vue.use(),但是 axios 并不能 use,只能每个需要发送请求的组件中即时引入为了解决这个问题,有两种开发思路,一是在引入 axios 之后,修改原型链,二是结合 Vuex,封装一个 aci...

【转载】Android卡顿检测方案

应用的流畅度最直接的影响了App的用户体验,轻微的卡顿有时导致用户的界面操作需要等待一两秒钟才能生效,严重的卡顿则导致系统直接弹出ANR的提示窗口,让用户选择要继续等待还是关闭应用。 所以,如果想要提升用户体验,就需要尽量避免卡顿的产生,否则用户经历几次类似场景之后,只会动动手指卸载应用,再顺手到应用商店给个差评。关于卡顿的分析方案,已经有以下两种: 分析...

Python实现多线程调用GDAL执行正射校正

python实现多线程参考http://www.runoob.com/python/python-multithreading.html #!/usr/bin/env python#coding:utf-8# #Description:# # #Author: LC#Date: # try: from osgeo importgdal except...

分布式系统互斥性与幂等性问题的分析与解决

随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问、海量数据处理的场景也越来越多。如何用较低成本实现系统的高可用、易伸缩、可扩展等目标就显得越发重要。 为了解决这一系列问题,系统架构也在不断演进。传统的集中式系统已经逐渐无法满足要求,分布式系统被使用在更多的场景中。 分布式系统由独立的服务器通过网络松散耦合组成。在这个系统...

面向对象电梯系列总结

一. 设计策略 1. 架构设计   三个线程:电梯,调度器,主线程(输入线程), 采用worker thread,生产者消费者模式。和同学讨论,发现有的观点认为:调度器更像是一个功能的集合,类似一个函数,不像是一个主体,而且线程越少bug一般而言越少,于是调度器不做为线程。也挺有道理。架构图如下:    其中task使用ConcurrentHashmap...

Javascript:再论Javascript的单线程机制 之 DOM渲染时机

Javascript:再论Javascript的单线程机制 之 DOM渲染时机 背景 Javascript是单线程事件驱动的,所有能看到的Javascript代码都是在一个线程执行,定时器回调和AJAX回调会在适当的时刻插入队列等待Javascript线程调度执行,今天想测试一下DOM渲染的线程与时机,具体的问题是: 修改DOM会立即显示在UI中吗? 一个...