//
// ZYOperationViewController.h
// Thread
//
// Created by yejiong on 14
//
// ZYOperation.h
// Thread
//
// Created by yejiong on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import <Foundation/Foundation.h> @interface ZYOperation : NSOperation @property (nonatomic, copy) NSString* operationName; @end

//
// ZYOperation.m
// Thread
//
// Created by yejiong on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import "ZYOperation.h" @implementation ZYOperation - (void)dealloc {
[_operationName release]; [super dealloc];
} //重写 main 方法,在这里写入我们需要在线程中执行的代码。
- (void)main {
// NSLog(@"--------%@", [NSThread currentThread]);
//
// if ([NSThread isMainThread]) {
// NSLog(@"主线程");
// }else {
// NSLog(@"分线程");
// } NSLog(@"%@", _operationName);
} @end
/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import <UIKit/UIKit.h> @interface ZYOperationViewController : UIViewController @end
//
// ZYOperationViewController.m
// Thread
//
// Created by yejiong on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import "ZYOperationViewController.h"
#import "ZYOperation.h" @interface ZYOperationViewController () {
NSOperationQueue* _operationQueue; } @property (nonatomic, retain) NSBlockOperation* blockOperation1; @end @implementation ZYOperationViewController - (void)dealloc {
[_operationQueue release]; [_blockOperation1 release]; [super dealloc];
} - (void)viewDidLoad {
self.view.backgroundColor = [UIColor whiteColor]; _operationQueue = [[NSOperationQueue alloc] init]; //设置最大并发数,同时最多有多少线程在执行。
_operationQueue.maxConcurrentOperationCount = ; //使用 NSBlockOperation 的时候需要注意是否造成循环引用。
__block ZYOperationViewController* blockSelf = self; self.blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
blockSelf.view.backgroundColor = [UIColor redColor];
}]; //没有造成循环引用。
NSBlockOperation* blockOperation = [NSBlockOperation blockOperationWithBlock:^{
self.view.backgroundColor = [UIColor redColor];
}];
} - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//NSOperation 是一个抽象类,我们不能使用它的对象,必须使用它子类的对象。
//系统提供了两个子类:NSInvocationOperation,NSBlockOperation。
//我们也可以自定义 NSOperation 子类,重写 mian 方法,然后把 operation 对象添加到 NSOperationQueue 中,就会自动在分线程执行 main 方法。 // [self invocationOperation]; // [self blockOperation];

//自定义
[self customOperation];
} - (void)invocationOperation {
NSInvocationOperation* invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@""]; //使用 start 在主线程执行任务。
// [invocationOperation start]; //如果需要在分线程执行任务,把对象添加到 NSOperationQueue,就会自动的在分线程执行任务。 [_operationQueue addOperation:invocationOperation]; [invocationOperation release];
} - (void)blockOperation {
NSBlockOperation* blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; //主线程
// [blockOperation start]; //分线程
// [_operationQueue addOperation:blockOperation]; [blockOperation addExecutionBlock:^{
NSLog(@"2--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; [blockOperation addExecutionBlock:^{
NSLog(@"3--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; [blockOperation addExecutionBlock:^{
NSLog(@"4--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; [blockOperation addExecutionBlock:^{
NSLog(@"5--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}]; //addExecutionBlock,并发的执行多个 block 任务,系统自动分配到当前空闲的线程,可能是主线程也可能是分线程。
// [blockOperation start]; //全部在分线程并发执行。
[_operationQueue addOperation:blockOperation];
} - (void)customOperation {
ZYOperation* operation = [[ZYOperation alloc] init]; operation.operationName = @""; ZYOperation* operation1 = [[ZYOperation alloc] init]; operation1.operationName = @""; ZYOperation* operation2 = [[ZYOperation alloc] init]; operation2.operationName = @""; //设置线程间的依赖关系。让一个线程等待另外一个线程执行完毕再开始执行。
[operation addDependency:operation1]; [_operationQueue addOperation:operation];
[_operationQueue addOperation:operation1];
[_operationQueue addOperation:operation2]; [operation release];
[operation1 release];
[operation2 release]; } - (void)run:(id)object {
NSLog(@"%@", object); if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
} //仍然使用这个方法回到主线程。
// self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>
} @end

线程2 NSOperation 抽像类的使用的更多相关文章

  1. 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?

    接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)? 1. 接口可以继承接口. 2. 抽像类可以实现(implements)接 ...

  2. php面向对象之抽像类、接口、final、类常量

    一.抽像类(abstract)        在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性语法结构:  代码如下 复制代码   ab ...

  3. Java并发包——线程安全的Collection相关类

    Java并发包——线程安全的Collection相关类 摘要:本文主要学习了Java并发包下线程安全的Collection相关的类. 部分内容来自以下博客: https://www.cnblogs.c ...

  4. Java并发包——线程安全的Map相关类

    Java并发包——线程安全的Map相关类 摘要:本文主要学习了Java并发包下线程安全的Map相关的类. 部分内容来自以下博客: https://blog.csdn.net/bill_xiang_/a ...

  5. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  6. 创建线程方式-NSOperation

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. c#跨线程访问控件帮助类

    1.背景 对于winform程序来说,当我们点击按钮,需要消耗一定时长才能拿到数据后才能显示在界面上某个控件上的情况,我们通常会专门开一个线程去拿数据,这样不会造成界面处于假死状态 2.常规做法 // ...

  8. java 之前的安全的类回顾,以及以后需要线程安全时使用哪些类

    之前所学习到的线程安全的类: StringBuffer:线程安全的可变字符序列.一个类似于 String 的字符串缓冲区,但不能修改. Vector:Vector 类可以实现可增长的对象数组. Has ...

  9. JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)

    实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...

随机推荐

  1. EmEditor正则表达式例子

    正则表达式中 单词指的是由字母.数字.下划线组合而成的字符串,用符号表示为\w(小写). 空白符包括单字节空格.双字节空格.制表符,用符号表示为\s(小写). 1.匹配被双引号包含的所有字符串(str ...

  2. linux 系统常用命令

    临时性的完全关闭防火墙,可以不重启机器: #/etc/init.d/iptables status                ##查看防火墙状态 #/etc/init.d/iptable stop ...

  3. centos6.4 挂载ntfs分区

    默认情况下,CentOS 6.4不支持Widows NTFS硬盘分区读写,要想把NTFS格式的磁盘挂载到CentOS 6.3下面需要安装第三方的插件ntfs-3g,这里我们采用编译安装插件. 1.安装 ...

  4. grep in linux

    1.作用linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global Regular Expression Print,表示全局正 ...

  5. 【转】并发编程之GCD

    http://blog.xcodev.com/blog/2013/11/04/gcd-intro/ Dispatch Queue Dispatch Queue是一个任务执行队列,可以让你异步或同步地执 ...

  6. POJ 1251 && HDU 1301 Jungle Roads (最小生成树)

    Jungle Roads 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/A http://acm.hust.edu.cn/vju ...

  7. Spring EL Lists, Maps example

    In this article, we show you how to use Spring EL to get value from Map and List. Actually, the way ...

  8. ASP.NET网站中设置404自定义错误页面

    在用ASP.NET WebForm开发一个网站时,需要自定义404错误页面. 做法是这样的 在网站根目录下建立了一个404.html的错误页面,然后在Global.asax文件中,加入如下代码: &l ...

  9. HTTP常见错误 400/401/403/404/500及更多

    HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...

  10. 集合引入(ArrayList、LinkedList)

    1.引入 代替数组固定大小操作不变 2.ArrayList 常用的操作(add,remove) 3.LinkedList 能实现一些特殊的操作(pop)