多线程代码

// NSObject

// 在子线程中执行代码

// 参数1: 执行的方法 (最多有一个参数,没有返回值)

// 参数2: 传递给方法的参数

//    [self performSelectorInBackground:@selector(cycling:) withObject:@"obj1"];

// 回到主线程更新页面

//    [self performSelectorOnMainThread:@selector(updateUI:) withObject:nil waitUntilDone:YES];

// NSThread

// 进入子线程

//    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(cycling:) object:@"thread"];

//    [thread start]; // 启动线程执行

//    [thread release];

//

//    // 直接启动

//    [NSThread detachNewThreadSelector:@selector(cycling:) toTarget:self withObject:@"thread2"];

// NSOperation

/*

// 通常使用NSOperation下的两个子类:NSInvocationOperation、NSBlockOperation

// NSInvocationOperation

NSInvocationOperation *invocationOperation = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cycling:) object:@"invocationOperation"] autorelease];

//    [invocationOperation start]; // 启动任务

// NSBlockOperation

NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

for (int i = 0; i < 10000; i++) {

NSLog(@"blockOperation: %i", i);

}

}];

//    [blockOperation start]; // 启动任务

// 创建一个任务队列,NSOperationQueue

NSOperationQueue *operationQueue = [[NSOperationQueue new] autorelease];

// 当blockOperation中的任务执行完毕后,invocationOperation才开始执行

//    [invocationOperation addDependency:blockOperation];

// 设置同时执行任务最大数

operationQueue.maxConcurrentOperationCount = 1;

// 添加任务到队列中

[operationQueue addOperation:blockOperation];

[operationQueue addOperation:invocationOperation];

*/

/**

*  GCD 分发队列 遵守FIFO原则

*  串行队列:当一个任务执行完之后,才可以进行下一个任务的执行

*  并行队列:任务在派发的时候是有顺序的,不用等到上一个任务执行完成之后再执行,同时执行

*/

/**

*  脱离线程:当线程内部的代码执行完毕之后,线程自动关闭。例如:NSThread / NSObject

*  非脱离线程:当线程内部的代码执行完毕之后,线程不关闭,等待着下一次的使用。例如:NSOperationQueue

*/

// 1. GCD 使用主队列实现任务的串行,主队列分派的任务,永远在主线程中

dispatch_queue_t mainQueue = dispatch_get_main_queue();

//    dispatch_async(mainQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第一个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(mainQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第二个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(mainQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第三个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

// 2. 使用自己创建出来的队列,实现任务的串行,新队列执行的任务,在子线程中执行

// 参数1: 队列的标示

// 参数2: 类型

dispatch_queue_t myQueue = dispatch_queue_create("com.lanou3g.lesson_22.myQueue", DISPATCH_QUEUE_SERIAL);

//    dispatch_async(myQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第一个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(myQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第二个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(myQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第三个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

// 3. 使用自己创建的队列,实现任务的并行,执行的任务在不同的子线程中执行

dispatch_queue_t myQueue2 = dispatch_queue_create("com.lanou3g.lesson_22.myQueue2", DISPATCH_QUEUE_CONCURRENT);

//    dispatch_async(myQueue2, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第一个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(myQueue2, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第二个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(myQueue2, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第三个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

// 4. 使用系统的globle队列,实现任务的并行,在子线程中

dispatch_queue_t globleQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//    dispatch_async(globleQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第一个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(globleQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第二个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

//    dispatch_async(globleQueue, ^{

//        for (int i = 0; i < 1000; i++) {

//            NSLog(@"第三个任务:%d %@", i, [NSThread currentThread]);

//        }

//    });

// 让代码只执行一次

for (int i = 0; i < 1000000; i++) {

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

NSLog(@"只执行一次");

});

}

// 让一段代码执行多次

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

NSLog(@"多次执行");

});

// 让代码延迟几秒执行

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

NSLog(@"延迟5秒执行");

});

/**

*  1. 发送网络请求,获取网络数据的时候需要使用多线程(但是:我们创建网络请求的时候并不需要单独去开启子线程,系统会在方法内部帮我们做这件事)

*  2. 当有耗时很长的计算的时候,建议使用多线程

*  3. 当处理数据库中,或者其它位置大量数据的时候使用多线程

*  4. 总结:将耗时比较长的代码,都放到子线程中运行

*  5. 重点:页面的刷新必须回到主线程中

*/

}

#pragma mark 循环

- (void)cycling:(id)obj

{

for (int i = 0; i < 10000; i++) {

NSLog(@"%@: %d", obj, i);

}

}

#pragma mark 发送网络图片请求

- (void)sendRequestForImageWithUrlStr:(NSString *)urlStr

{

// http://pic.sucaiw.com/up_files/bizhi/a09ba7547e/sucaiw-cdscbj4023.jpg

// 1. 直接通过NSData获取网络资源数据

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic.sucaiw.com/up_files/bizhi/a09ba7547e/sucaiw-cdscbj4023.jpg"]];

// 2. 更新图片

// 参数1: 主线程执行的方法

// 参数2: 传递给方法的参数

// 参数3: 是否等待子线程内执行完毕

[self performSelectorOnMainThread:@selector(updateUI:)

withObject:[UIImage imageWithData:data]

waitUntilDone:YES];

}

#pragma mark - 更新页面

- (void)updateUI:(UIImage *)image

{

_imageView.image = image;

}

- (IBAction)buttonAction:(UIButton *)sender

{

//    [self sendRequestForImageWithUrlStr:nil];

// 子线程中请求图片

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

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

for (int i = 0; i < 10; i++) {

NSLog(@"%d", i);

}

});

时间: 2024-10-12 18:04:23

多线程代码的相关文章

Eclipse调试多线程代码

Eclipse调试多线程代码 标签: eclipse 调试 多线程 | 发表时间:2013-02-16 05:51 | 作者:czjuttsw 分享到: 出处:http://blog.csdn.net 相信到现在为止,不管是什么编程语言,程序员都使用了IDE,IDE简化了程序员的开发过程.IDE能够管理项目,自动生成代码,自动生成文档,以及调试应用程序. 默认情况下,在调试多线程程序时,当遇到断点时(breakpoint),当前线程暂停,而其它线程继续运行,这是我们不想要看到的.比如下面的例子:

编写多线程代码时,启动线程后等待线程结束方法

在编写多线程代码时,如果主线程结束,那么子线程也会随之结束,如何等待线程结束再往下执行.   等待线程执行完成代码.   线程代码:   package demo; import java.util.concurrent.CountDownLatch; public class NodeSqlThread1 implements Runnable{         private CountDownLatch cdlSync;         public NodeSqlThread1(Coun

JavaScript 编写多线程代码引用Concurrent.Thread.js(转)

这是一个很简单的功能实现: <script type="text/javascript" src="Concurrent.Thread.js"></script> <script type="text/javascript"> Concurrent.Thread.create(function(){ var i = 0; while ( 1 ) { document.body.innerHTML += i++

第六周的多线程代码测试题补交的博客

要求:编译运行多线程程序,提交编译和运行命令截图 代码如下: 运行过程和结果: 原文地址:https://www.cnblogs.com/morvalhe/p/12069840.html

多线程代码讲解

threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 开启多线程的两种方法 方法1: 常用 from threading import Thread def task(): print('is running') if __name__=='__main_

能够编写出更规范多线程代码避免不要的异常

进程使用更多的系统资源,因为每个进程需要独立的地址空间.而线程只有一个内核对象及一个堆栈.如果有空间资源和运行效率上的考虑,则优先使用多线程.正因为每个地址有自已独立的进程空间,所以每个进程都是独立互不影响的.而一个进程中所有线程是共用进程的地址空间的,这样一个线程出问题可能影响到所有线程.像多标签浏览器容易一个见面假死导致整个浏览无法使用.所以像360浏览器等每个标签页都是一个进程,这样一个标签页面出问题并不会影响到其他标签页面. 这意味着mysql服务器将在存储引擎检索行后再进行过滤,许多w

ConcurrentDictionary让你的多线程代码更优美

ConcurrentDictionary是.net4.0推出的一套线程安全集合里的其中一个,和它一起被发行的还有ConcurrentStack,ConcurrentQueue等类型,它们的单线程版本(线程不安全的,Queue,Stack,Dictionary)我们一定不会陌生,可以说是经常用到,一个类的实例里,有个属性是个字典,我们不加考虑的会用Dictionary,而当这个属性被提升为static静态的(类级别的)时候,我们就要考虑它的线程安全性了,因为它有可能被多个线程同时访问,当然,如果这

Java多线程代码示例

package algorithm; class Mythread extends Thread{ String name; public Mythread(String name){ this.name=name; } public void run(){ System.out.println(name+":step1"); System.out.println(name+":step2"); System.out.println(name+":step

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程