线程的理解一

-、NSOperation

 1 - (void)demoAboutNSOperation
 2 {
 3    NSOperation * block =  [NSBlockOperation blockOperationWithBlock:^{
 4         NSLog(@"block %@",[NSThread currentThread]);
 5     }];
 6
 7     [self.queue addOperation:block];
 8
 9     [self.queue addOperationWithBlock:^{
10         NSLog(@"耗时操作 %@",[NSThread currentThread]);
11         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
12             NSLog(@" mainQueue %@",[NSThread currentThread]);
13         }];
14     }];
15
16
17 }

二  gcd

 - (void)dispatchDemo
 2 {
 3     NSLog(@" start %@",[NSThread currentThread]);
 4
 5     dispatch_async(dispatch_get_global_queue(0, 0), ^{
 6         NSLog(@" 耗时从左 %@",[NSThread currentThread]);
 7
 8         dispatch_sync(dispatch_get_main_queue(), ^{
 9             NSLog(@" 回到主线程 %@", [NSThread currentThread]);
10         });
11
12     });
13
14     NSLog(@"end %@",[NSThread currentThread]);
15 }

 //  后台执行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });
 // 主线程执行:
 dispatch_async(dispatch_get_main_queue(), ^{
      // something
 });
 // 一次性执行:
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     // code to be executed once
 });
 // 延迟2秒执行:
 double delayInSeconds = 2.0;
 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     // code to be executed on the main queue after delay
 });
 // 自定义dispatch_queue_t
 dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
 dispatch_async(urls_queue, ^{
   // your code
 });
 dispatch_release(urls_queue);
 // 合并汇总结果
 dispatch_group_t group = dispatch_group_create();
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程一
 });
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程二
 });
 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
      // 汇总结果
 });

GCD的另一个用处是可以让程序在后台较长久的运行。

在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作。但是在使用GCD后,app最多有10分钟的时间在后台长久运行。这个时间可以用来做清理本地缓存,发送统计数据等工作。

让程序在后台长久运行的示例代码如下:

// AppDelegate.h文件
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;

// AppDelegate.m文件
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self beingBackgroundUpdateTask];
    // 在这里加上你需要长久运行的代码
    [self endBackgroundUpdateTask];
}

- (void)beingBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
        NSError * error;
        NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (data != nil) {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"call back, the data is: %@", data);
            });
        } else {
            NSLog(@"error when download:%@", error);
        }
    });
时间: 2024-08-03 07:55:12

线程的理解一的相关文章

【C/C++多线程编程之五】pthread线程深入理解

多线程编程之pthread线程深入理解  Pthread是 POSIX threads 的简称,是POSIX的线程标准. 前几篇博客已经能给你初步的多线程概念.在进一步学习线程同步等多线程核心知识之前,须要对多线程深入的理解.非常多人忽略或者回避这部分内容,直接的问题是学习者无法把握多线程编程的内在原理,理解的层次太浅.           1.进程资源:                      进程资源有存储资源与其它资源.其它资源包括环境变量.地址,文件等.存储资源.进程的内存分配,博客[

【转】关于Java的Daemon线程的理解

原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html 关于Java的Daemon线程的理解 网上对Java的Daemon线程的说法很多,看的人头晕. 所以自己就来总结一下: Java语言自己可以创建两种进程“用户线程”和“守护线程” 用户线程:就是我们平时创建的普通线程. 守护线程:主要是用来服务用户线程. 那么如何来区分这两种线程呢? 其实在JDK的文档中已经说明的很清楚了: * The Java Virtu

python 进程线程简单理解

简单的理解 1.线程:最小的执行单元:进程:最小的资源单元 2.一个程序至少有一个进程,一个进程至少有一个线程(线程可以理解为线程的容器) 3.进程在执行过程中拥有独立的内存单元,而多个线程共享内存 4.每一个独立的线程都有 程序的入口,顺序执行的序列和程序出口,但是线程不能独立执行,必须由应用程序提供多个线程执行控制 5.进程是系统进行资源分配和调度的一个独立单元 多线程的代码开启 import threading import time def sing(): print("begin to

关于线程的理解

1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间.别把它

进程和线程通俗理解

cpu:工厂 一次只能有一个车间开工:cpu一次只能运行一个任务 进程就好比工厂的车间,它代表CPU所能处理的单个任务.任一时刻,CPU总是运行一个进程,其他进程处于非运行状态 一个车间里,可以有很多工人.他们协同完成一个任务.线程就好比车间里的工人.一个进程可以包括多个线程 车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的.这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存. 互斥锁.信号量 ..... 操作系统的设计,因此可以归结为三点: (1)以多进程形式,允许多

Python多线程的创建,相关函数和守护线程的理解

一:多线程的创建 threading库创建线程有两种方式,函数式和继承式    1)函数式 def func(): print 'Starting' print 'Ending' t=threading.Thread(name='func',target=func) t.start() 2)继承式 class ThreadClass(threading.Thread): def __init__(self, group = None, target = None, name = None, ar

多线程编程之pthread线程深入理解

不同的平台和操作系统上 进程和线程的实现机制不完全一致  但是一般来说线程栈都是独立的 只要得到地址就可以相互访问  Pthread是 POSIX threads 的简称,是POSIX的线程标准. 前几篇博客已经能给你初步的多线程概念,在进一步学习线程同步等多线程核心知识之前,需要对多线程深入的理解.很多人忽略或者回避这部分内容,直接的问题是学习者无法把握多线程编程的内在原理,理解的层次太浅.             1.进程资源:                      进程资源有存储资源与

Java线程池理解

线程池原理理解 作用: 线程池的作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果: 少了浪费系统资源,多了造成系统拥挤效率不高. 用线程池控制线程数量,其他线程排队等候.一个任务执行完毕,再从队列中取最前面的任务开始执行. 若队列中没有等待进程,线程池的这一资源处于等待. 当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了:否则进入等待队列. 为什么要用线程池: 1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用

C#学习第八弹之线程基础理解

学过Linux或者Java的应该都知道线程的概念,C#也支持通过多个线程来并行执行任务.任何一个C#的程序会开始于一个单线程(由CLR和OS自动创建的主线程). 下面是简单的例子: 1 using System; 2 using System.Threading; 3 4 namespace Test 5 { 6 class Program 7 { 8 static void WriteX() 9 { 10 for ( int i = 0; i < 10; i++ ) 11 { 12 Conso

进程和线程学习理解

1 fork基本概念 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: /* * @filename: fork_test.c * @ve