ios多线程实现种类

NSThread

NSOperationQueue

NSObject
GCD

***************

1.NSThread

//线程

第一种

NSThread *thread1=[[NSThread alloc] initWithTarget:self selector:@selector(sum) object:nil];

//

//    //给线程起名字

thread1.name=@"thread1";

//    //启动线程

[thread1 start];

//结束线程

[thread1 cancel];

第二种(不需要手动开启的)

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

2. NSOperation的两个子类

//一.

NSInvocationOperation *inop=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocation) object:nil];

//   [inop start];

//二.

NSBlockOperation *blop=[NSBlockOperation blockOperationWithBlock:^{

NSLog(@"我是block");

}];

//创建队列

NSOperationQueue *queue=[[NSOperationQueue alloc] init];

//设置最大并行数量

queue.maxConcurrentOperationCount=2;

//添加事件

[queue addOperation:inop];

[queue addOperation:blop];

3.NSObject

[self performSelectorInBackground:@selector(sum) withObject:nil];

4.GCD

//GCD (先进先出 FIFO)

//串行:前一个任务完成,后一个任务才能执行

//并行:任务在派发时有序的,但是不应等第一个任务执行完成才开始.

//GCD队列分3中:主队列,全局队列,自定义队列

//1.使用主队列实现任务派发(串行),在主线程中

dispatch_queue_t mainQueue=dispatch_get_main_queue();

//1.1添加任务

dispatch_async(mainQueue, ^{

NSLog(@"第一个任务:当前线程是%@",[NSThread currentThread]);

});

//串行

//2.自定义队列

/*

dispatch_queue_t myQueue=dispatch_queue_create("com.lanlan.myqueue", DISPATCH_QUEUE_SERIAL);

//2.1添加任务

dispatch_async(myQueue, ^{

NSLog(@"第一个任务:当前线程:%@",[NSThread currentThread]);

});

//并行

//3.自定义队列

/*

dispatch_queue_t myQueue2=dispatch_queue_create("com.lanlan.myqueue", DISPATCH_QUEUE_CONCURRENT);

//3.1添加任务

dispatch_async(myQueue2, ^{

NSLog(@"第一个任务:当前线程:%@",[NSThread currentThread]);

});

//4.全局队列

/*

dispatch_queue_t globelQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//4.1添加任务

dispatch_async(globelQueue, ^{

NSLog(@"第一个任务:当前线程:%@",[NSThread currentThread]);

});

5.只保证执行一次

//保证只执行一次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

NSLog(@"这里的代码只执行一次");

});

6.延迟5秒后执行

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

NSLog(@"等我5秒...");

});

7.//重复执行

dispatch_apply(5, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t t) {

NSLog(@"今天天气不错");

});

//子线程

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

//回到主线程

[self performSelectorOnMainThread:@selector(mymainTherad) withObject:self waitUntilDone:NO];

-(void)mymainTherad

{

//打印线程

NSLog(@"我在主线程里%@",[NSThread currentThread]);

}

多线程 NSThread GCD的更多相关文章

  1. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  2. iOS中的多线程NSThread/GCD/NSOperation & NSOperationQueue

    iOS多线程有四套多线程方案: Pthreads NSThread GCD NSOperation & NSOperationQueue 接下来我来一个一个介绍他们 Pthreads 在类Un ...

  3. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  4. iOS开发多线程篇—GCD介绍

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  5. iOS开发多线程篇—GCD的基本使用

    iOS开发多线程篇—GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进 ...

  6. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  7. [iOS]多线程和GCD

    新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...

  8. iOS开发多线程篇—GCD简介

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  9. 多线程:GCD

    多线程是程序开发中非常基础的一个概念,大家在开发过程中应该或多或少用过相关的东西.同时这恰恰又是一个比较棘手的概念,一切跟多线程挂钩的东西都会变得复杂.如果使用过程中对多线程不够熟悉,很可能会埋下一些 ...

随机推荐

  1. Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法

    我的Oracle 10g版本是10.2.0.1.0,(10.1同理)选择高级安装,提示“程序异常终止,发生未知错误”. 1.修改Oracle 10G\database\stage\prereq\db\ ...

  2. Effective Java单元测试TestNG - 就是爱Java

    TestNG是另一种单元测试的framework,与JUnit的类似,这次Mix将使用它来撰写测试程序,大部分所引用的class package都一样,只差在JUnit与TestNG的字样,可以直接用 ...

  3. ExtJs Model之convert的使用

    convert: function(value,record){} value:为当前属性的值,record.get('属性')用来获取其他属性的值. 以下案例是:将年龄减去2. Ext.define ...

  4. Ext.getCmp()的简单使用

    Ext.getCmp(Ext组件ID),根据Ext组件的ID选择EXT组件. 例如:点击Panel->toolbar上的button改变Panel的标题 Ext.onReady(function ...

  5. poj 1129 Channel Allocation

    http://poj.org/problem?id=1129 import java.util.*; import java.math.*; public class Main { public st ...

  6. USB class总结

    以下是总结的USB的类,不同的USB类,主机询问的描述符格式和内容都不一样,具体的descriptor的内容可以查看 USB spec(http://www.usb.org/home/),如HID的s ...

  7. jquery validationEngine的使用

    1.引入文件 <script src="/js/jquery-1.4.2.min.js" type="text/javascript"></s ...

  8. HTTP协议及HTTP包

    HTTP协议用于在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议 ——客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTTP包.HTTP协议使用可靠的TCP连 ...

  9. 剑指offer-面试题10:二进制中1的个数

    题目:请实现一个函数,输入一个函数,输出该数二进制表示中1的个数.例如把9 表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 这道题最典型的方法就是用移位统计,就比如统计9的二进制1 ...

  10. Linux中shell文件操作大全

    1.创建文件夹#!/bin/shmkdir -m 777 "%%1" 2.创建文件#!/bin/shtouch "%%1" 3.删除文件#!/bin/shrm ...