多线程的学习和巩固

NSThread

-(void)commonThread
{
    /**
     使用NSThread感觉不方便的地方就是每次使用线程都得创建一个新的方法。不过它的方法好记,简单易用,只是功能上有点弱。
     */
    //NSThread的两种使用
    //1.
    NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(readNUm1) object:nil];
    [thread1 start];
    //2.
    [NSThread detachNewThreadSelector:@selector(loadThreadArgumentWithStr:) toTarget:self withObject:@"argument"];

    //回到主线程中做一些事情(UI只能在主线程中刷新,当然干点别的肯定也是可以的)
    [self performSelectorOnMainThread:@selector(readNum2) withObject:nil waitUntilDone:NO];

    //NSObject - 对象的某个方法可以直接在后台运行
    [self performSelectorInBackground:@selector(loadThreadArgumentWithStr:) withObject:@"NSobjectThread"];
}

NSOperation&NSOperationQueue

//NSOperationQueue会建立一个线程管理器,每个加入到线程operation会有序的执行。
-(void)loadOperation
{
    /**
    [XXXXX new] ~= [[XXXX alloc]init]   new是隐式调用了init,如果使用alloc/init 我们可以定制initXXX
     */
    NSOperationQueue *queue = [NSOperationQueue new];
    //设置线程最大并发数
    [queue setMaxConcurrentOperationCount:2];

    NSInvocationOperation *operation =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadReadNums) object:nil];
    NSInvocationOperation *operation2 =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadReadNums2) object:nil];
    NSInvocationOperation *operation3 =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadReadNums) object:nil];
    [queue addOperation:operation];
    [queue addOperation:operation2];
    [queue addOperation:operation3];

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<10; i ++)
        {
            NSLog(@"NSBlockOperation -->%zi",i);
        }
    }];
    [queue addOperation:blockOperation];
}

添加依赖关系

-(void)AddPriorityOperation
{
    NSOperationQueue *queue = [NSOperationQueue new];
    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 1");
    }];

    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 2");
    }];

    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 3");
    }];

    NSBlockOperation *blockOperation4 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 4");
    }];

    NSBlockOperation *blockOperation5 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 5");
    }];

    NSBlockOperation *blockOperation6 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation 6");
    }];

    [blockOperation6 setQueuePriority:NSOperationQueuePriorityHigh];

    [blockOperation6 addDependency:blockOperation1];//依赖关系优于优先级的设定
    [blockOperation1 addDependency:blockOperation2];
    [blockOperation2 addDependency:blockOperation3];
    [blockOperation3 addDependency:blockOperation4];
    [blockOperation4 addDependency:blockOperation5];

    [queue setMaxConcurrentOperationCount:6];
    [queue addOperation:blockOperation1];
    [queue addOperation:blockOperation2];
    [queue addOperation:blockOperation3];
    [queue addOperation:blockOperation4];
    [queue addOperation:blockOperation5];
    [queue addOperation:blockOperation6];
}

 GCD的使用

 1 -(void)dispatchMethods
 2 {
 3     //1.后台执行
 4     dispatch_async(dispatch_get_global_queue(0, 0), ^{
 5         //dosomething
 6     });
 7     //2.主线程执行
 8     dispatch_async(dispatch_get_main_queue(), ^{
 9         //dosomething
10     });
11     //3.一次执行
12     static dispatch_once_t onceToken;
13     dispatch_once(&onceToken, ^{
14         //代码会被执行一次
15     });
16     //4.延时执行
17     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC);
18     dispatch_after(time, dispatch_get_main_queue(), ^(void){
19         //2秒后执行
20     });
21     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
22         //2秒后执行
23     });
24     //5.自定义方式 使用idspatch_queue_create方法
25     dispatch_queue_t urls_queue = dispatch_queue_create("url", NULL);
26     dispatch_async(urls_queue, ^{
27         //执行代码
28     });
29     //6.在后台并行执行多个线程,并在执行完后汇总执行结果,
30     //用dispatch_group,dispatch_async和dicpatch_group_notify实现
31     dispatch_group_t group = dispatch_group_create();
32     dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
33         //线程任务一
34     });
35     dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
36         //线程任务二
37     });
38     dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
39         //汇总结果。。。在所有group中的线程任务都完成后会执行该方法
40     });
41 }
时间: 2024-11-10 01:59:43

多线程的学习和巩固的相关文章

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

多线程的学习与GDI的学习

今天又是一周的周五,感觉过的好快,我感觉不是期盼周末的到来,而是感觉现在已经习惯啦每天坐在这里敲代码,其实我是一个性格非常开朗的女生,现在不知道为什么感觉默默地坐在自己位置上面敲代码成为了我习以为常的事情,虽然也有不想这样子的事情,但是我感觉我还要掌握好多啊,现在只是刚开始,跟着老师讲课的步伐慢慢的在前进,可是太多知识的掌握还是依赖于自己的领悟,现在就是感觉太多不懂的知识,是不是开始焦虑我不知道啦,不过我会努力啦.嘿嘿,今天我们学习啦多线程和GDI,下面就总结一下. 一.多线程 在学习多线程前我

Java中多线程的学习和使用(一)概述及创建方式

转载请注明http://www.cnblogs.com/devtrees/p/4395477.html 多线程的学习 一.多线程概述 (一).进程与线程 在说多线程或者线程之前,让我们来了解一下更显而易见的进程概念.那什么是进程呢? 进程就是正在进行中的程序. Windows操作系统中在任务栏处右击,弹出的菜单中可看见任务管理器,打开它,就可以看见当前运行的程序和进程列表. 进程:是一个正在执行中的程序. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程

java多线程入门学习(一)

java多线程入门学习(一) 一.java多线程之前 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.     线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.     线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止.     多进程是指操作系统能同时运行多个任务(程序).     多线程是指在同一程序中有多个顺序流在执行. 在java中要想实现多线程,有两种手段,一种是继承T

多线程的学习笔记

线程的简单学习笔记: 1.进程与线程的概念 进程:从用户角度看进程是应用程序的一个执行过程. 从操作系统核心角度看进程代表的是操作系统分配的内存和CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境. 线程:是程序执行流的最小单位(处理器调度的最小单位) 线程是一个程序中一个单一的顺序控制流程. 线程是程序执行的一条路径, 一个进程中可以包含多条线程. 2.创建线程 在线程类使用new 关键字实例化之后且在调用start()方法之前,线程处于创建状态,处于创建状态的线程仅仅分配了内存空

多线程编程学习笔记——线程池(一)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 接上文 多线程编程学习笔记——线程同步(三) 创建多线程操作是非常昂贵的,所以每个运行时间非常短的操作,创建多线程进行操作,可能并不能提高效率,反而降低了效率. 如果你有非常多的执行时间非常短的操作,那么适合作用线程池来提高效率,而不是自行创建多线程. 线程池,就是我们先分配一些资源到池子里,当我们需要使用时,则从池子中获取,用完了,再放回池子里. .NET中的线程池是受CLR管理的,TheadTool类

多线程编程学习笔记——线程同步(三)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 七.使用Barrier类 Barrier类用于组织多个线程及时在某个时刻会面,其提供一个回调函数,每次线程调用了SignalAndWait方法后该回调函数就会被执行. 1.代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //

多线程编程学习笔记——async和await(二)

接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步调用 . 1.示例代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Thread

多线程编程学习笔记——async和await(三)

接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多个并行的异步操作使用await时聚合异常. 1.程序示例代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

多线程编程学习笔记——使用并发集合(三)

接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 四.   使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费任务的工作者间如何扩展工作量. 1.程序代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sy