Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

22day NSThread

$
0
0

重点:
NSThread

多线程基础、pthread、开启线程的3种方式
线程的状态、线程安全问题、线程间的通信

GCD

同步方法和异步方法、队列的使用、线程间的通信
延迟执行、一次性代码、队列组、单例模式-ARC、单例模式-MRC、用宏抽取单例模式

NSOperation

NSOperation和NSOperationQueue的概念理解、NSInvocationOperation、NSBlockOperation
NSOperationQueue的常见方法、最大并发数、操作依赖、队列的取消\暂\恢

一、NSThread的基本使用

1、thread的演示

#import <pthread.h>
@interface ViewController ()
@end
@implementation ViewController
void *run(void *data){
    for (int i=0; i<10000; i++) {
        NSLog(@"%s,%@",__func__,[NSThread currentThread]);
    }
    return NULL;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    pthread_t *myrestrict;
    NSLog(@"%s,%@",__func__,[NSThread currentThread]);
    //创建线程
    pthread_create(&myrestrict, NULL, run, NULL);
}

2、线程安全(了解)

NSThread线程的创建

#pragma mark - 创建线程
- (void) createThread1{
    //    方式二:创建线程后自动启动线程
    //    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];
    //    方式三:隐式创建并启动线程
    [self performSelectorInBackground:@selector(run:) withObject:@"http://10.9.10.116/tlxy/pages"];
    //    [self performSelector:@selector(run:) withObject:nil];s//直接调用方法。不会创建线程
    /*
     方式二、方式三的优缺点:
     优点:简单快捷
     缺点:无法对线程进行更详细的设置
     */
}
- (void) createThreadByinitWithTarget{
    /*
     线程的调度优先级(了解)
     + (double)threadPriority;
     + (BOOL)setThreadPriority:(double)p;
     - (double)threadPriority;
     - (BOOL)setThreadPriority:(double)p;
     调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
     */
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil];
    [thread start];//Starts the receiver.进入就绪状态
    [thread setName:@"lydia"];//设置线程名字
}

线程安全

/**
 atomic:原子属性,为setter方法加锁(默认就是atomic)
 nonatomic:非原子属性,不会为setter方法加锁
1、 nonatomic和atomic对比
 atomic:线程安全,需要消耗大量的资源
 nonatomic:非线程安全,适合内存小的移动设备
 2、iOS开发的建议
 1)所有属性都声明为nonatomic
 2)尽量避免多线程抢夺同一块资源
 3)尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力
 */
@property (nonatomic,strong) NSThread *thread1;

/**
 安全隐患解决 – 互斥锁
 @synchronized(锁对象) { // 需要锁定的代码  }
 注意:锁定1份代码只用1把锁,用多把锁是无效的
 1、互斥锁的优缺点
 优点:能有效防止因多线程抢夺资源造成的数据安全问题
 缺点:需要消耗大量的CPU资源
 2、互斥锁的使用前提:多条线程抢夺同一块资源
 ps:相关专业术语:线程同步
 线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
 互斥锁,就是使用了线程同步技术
 */
- (void)run{
    while (1) {
        @synchronized(self) {//加锁
            int count = self.poll;
            if (count>0) {
                [NSThread sleepForTimeInterval:0.1];
                self.poll--;
                NSLog(@"%s---name:%@,poll = %d",__func__,[[NSThread currentThread] name],self.poll);
            }else{
                break;
            }
        }//解锁
    }
}

3、线程间的通讯

作者:u011018979 发表于2017/7/4 15:20:32 原文链接
阅读:52 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>