主线程和分线程

//

//  ViewController.m

//  MultiThread

//

//  Created by mac on 15-9-28.

//  Copyright (c) 2015年 zy. All rights reserved.

//

#import "ViewController.h"

#import "MyOpearation.h"

#import "My.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

//    多线程原理

//    1.一个CPU在同一个时间内,是只能执行一个线程的

//    2.CPU在多个线程之间来回调度(跳转),如果跳转速度很快,就造成了多个线程的假象.

//    实现多线程的方法

/*

1.NSThread

2.NSOperationQueue

3.GCD grand centrol dispatch  (调度中心)

使用GCD 可以创建 串行 线程队列  可以创建 并行线程队列

//     串行:队列中A,B,C 三个任务 , 依次执行

//     并行:队列中A,B,C 三个任务 , 并列(全部同时)执行

*/

/*********************************************/

//使用 NSOperation 和NSOperationQueue结合实现多线程

/*

1.创建NSOperation操作对象

2.把创建的NSOperation对象放到NSOperationQueue操作队列中

3.系统自动会去NSOperationQueue操作队列中获取一个NSOperation操作对象,并开启一个分线程执行操作.

*/

//    NSOperation 是一个抽象类    不具备创建对象的能力不能使用它来创建一个对象

//    只能使用NSOperation的子类来创建一个NSOperation的对象(//                               1.NSInvocationOperation

//   2. NSBlockOperation

//   3.自定义  NSOperation的子类

//   使用 NSInvocationOperation 创建操作对象

//    1. 目标     2.方法名称   3. 方法参数

/**********************************************************/

//    NSInvocationOperation * opearation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(OpearationText1) object:nil];

//    开始执行操作,一旦开始执行操作,就会执行操作指定的方法OpearationText1

//    [opearation1 start];

//    NSInvocationOperation 创建的操作对象默认是在主线程中执行的

/**********************************************************/

//    使用 NSBlockOperation来创建一个操作对象

//    bloc块中  是操作具体实现的内容

//    其实只是把OpearationText方法中的内容写到Block块中;

//    NSBlockOperation * blockOpearationTest2=[NSBlockOperation  blockOperationWithBlock:^{

//        NSLog(@"这是blockOpearationTest2执行的内容------%d",[NSThread isMainThread]);

//        [NSThread sleepForTimeInterval:2];

//    }];

//    可以在blockOpearationTest2 任务中添加其他的一些任务

//    [blockOpearationTest2 addExecutionBlock:^{

//        NSLog(@"这是blockOpearationTest2执行的内容2------%d",[NSThread isMainThread]);

//        [NSThread sleepForTimeInterval:10];

//    }];

//    [blockOpearationTest2 start];

//    NSBlockOperation 创建的操作对象默认是在主线程中执行的

//    如果NSBlockOperation 中有附加操作内容,那么额外添加的操作内容是在分线程中执行的

/**********************************************************/

//    自定义操作对象

//    自定义一个类  继承NSOperation

//    MyOpearation * MyOpearatiotest3=[[MyOpearation alloc] init];

//    自定义操作开始执行,执行main方法里边的内容

//    [MyOpearatiotest3 start];

//    自定义操作对象也是在主线程中执行的

/**********************************************************/

//    创建一个操作对象,然后把操作对象放入queue对列中

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

//    对列中最大的线程并发数  也就是说对列可以一次性的执行多少个分线程

//    [queue setMaxConcurrentOperationCount:5];

//    如果队列中多余5个线程,那么第六个线程必须要等待前5个线程中某一个执行完毕才能执行

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

//    {

//        MyOpearation * opear4=[[MyOpearation alloc]init];

//        [queue addOperation:opear4];

//    }

//    [queue addOperation:blockOpearationTest2];

//    操作对象的顺序取决于

//    1.对象之间的依赖关系

//    2.对象优先级

//    MyOpearation * opear5=[[MyOpearation alloc]init];

//    My * opear6=[[My alloc]init];

//    addDependency 从属   即5对象依赖于6

//    当6执行完毕之后才能执行5   与放入队列中的先后顺序是没有关系的 当他们都放入队列中时现执行6后执行5

//    [opear5 addDependency:opear6];

//    设置操作的优先级

//    Priority:优先级

//    先执行优先级高的在执行优先级低的

//    [opear5 setQueuePriority:NSOperationQueuePriorityVeryHigh];

//    [queue addOperation:opear5];

//    [queue addOperation:opear6];

//    当把操作对象放入队列中之后,不需要调用对象的start方法,操作对象会自动执行

}

//-(void)OpearationText1

//{

//    NSLog(@"这是opearation1执行的方法");

//    NSLog(@"OpearationText1%d",[NSThread isMainThread]);

//}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

时间: 2024-12-08 15:46:39

主线程和分线程的相关文章

接上 主线程和分线程的另一种方法GCD

// //  ViewController.m //  GCD // //  Created by mac on 15-9-28. //  Copyright (c) 2015年 zy. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDi

Android主线程、子线程通信(Thread+handler)

Android是基于Java的,所以也分主线程,子线程! 主线程:实现业务逻辑.UI绘制更新.各子线程串连,类似于将军: 子线程:完成耗时(联网取数据.SD卡数据加载.后台长时间运行)操作,类似于小兵: 一.子线程向主线程发消息(Thread+handler): 1.主线程中定义Handler: Java代码   Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.h

第一章、主线程与子线程

第一章.主线程与子线程 但我们打开FBReader程序的一刻,代码会立即创建一个子线程.之后,主线程会负责在屏幕上显示一个进度条,而子线程则在后台开始读取epub文件. PS:进度条的样子如下图所示,不过由于加载速度很快,这进度条都是一闪而过的.这张图片是在单步调试的环境下截取的. 在这一章,我们将详细介绍,程序如何创建子线程,以及如何控制进度条的显示与消失. 本章涉及的核心类是UIUtil类. FBReader默认首先进入的FBReader类,这是在AndroidManifes.xml设定的.

Java实现主线程等待子线程

本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器.初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,他的await()方法会阻塞当前进程,直到倒数至0. join方式代码如下: [java] view plain copy package com.test.thread

C#主线程等待子线程运行结束

佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然后在主线程中弹出一个提示框,显示数据正在加载,等子线程运行结束后,主线程继续工作. 使用的是http://hi.baidu.com/oktell/item/5527f51d93abb4a5feded5a8中所提到的方法,用了这篇文章中的第一个方式,即不带参数的. 之后在其中加入了显示和关闭提示框的代

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

Android Handler主线程和一般线程通信的应用分析

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会

(转)C#/.NET主线程与子线程之间的关系

一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少一个主线程”,这一说法持有怀疑         主线程与子线程之间的关系         **默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程         *当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束         *当子线程是后台线程,则主线程的结束,会导致子线程的强迫结

Qt之主线程与子线程通信(linux下)

转载请注明出处:http://blog.csdn.net/feng1790291543  主线程与子线程通信主要是通过Qt上的G ui按钮,触发使得主线程上的信息发送到子线程中,并且时刻监测线程的运行情况 主线程,头文件: #ifndef MANAGEWIDGET_H #define MANAGEWIDGET_H #include <QtGui/QWidget> #include <QtCore> //#include "childwidget.h" //#in