RunLoop在main线程和自己创建的线程如何启动

本文介绍:这篇博客主要是描述的是RunLoop的启动机制。内容属于简单的系类的。

一、RunLoop和线程的关系

  每一个RunLoop对应一个线程。每一个线程都可以拥有一个RunLoop,这也就是说线程可以创建一个属于自己的Runloop,也可以不创建自己的RunLoop。这都是根据程序内部的需求来决定的。这里需要注意的是:你创建一个runLoop但是你还必须要手动的让其run。

二、main线程的RunLoop

  主线程是灌注这个程序的。而与main线程相对应的RunLoop是在程序启动的时候就开始生成。并且开始run。这些功能都是通过在这个函数实现的

UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

三、自己创建的线程的runloop

  你通过GDC创建了自己的一个线程。你想在自己的线程中使用runloop。那么你必须分两步走:

  (1)创建自己的runloop。(在这里说明一下,runloop是不能自己创建的。但是你可通过 getrunloop来获取,源码中是这样写的)

  (2)让runloop跑起来 CFRunLoopRun();

四、代码分析

  (1)在主线程中插入一个NSTimer源,你可以直接这些写:

- (void)viewDidLoad {
[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(run) userInfo:nil repeats:NO];
}-(void)run{    NSLog(@"run");}

因为是在主线程中运行这个代码。所以NSTimer就自动的插入了主线程对应的RunLoop,而且你都不需要执行RunLoop Run的方法。

 (2)在自己创建的线程中执行这段代码

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    dispatch_queue_t queue = dispatch_queue_create("zhaoyan", 0);
    dispatch_async(queue, ^{
        CFRunLoopRef runLoop = CFRunLoopGetCurrent();

       [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(run) userInfo:nil repeats:NO];

    });
}

-(void)run
{
    NSLog(@"run");
}

  这时候你会发现,在你的控制台中并不能输出字符串 run,这是因为你在名为“zhaoyan”线程中执行,但是这个线程中并没有创建runloop而且,runloop并没有run起来,所以不能执行,所以我们应该更改一下代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 如果你在
    dispatch_queue_t queue = dispatch_queue_create("zhaoyan", 0);
    dispatch_async(queue, ^{
        CFRunLoopRef runLoop = CFRunLoopGetCurrent();

//        [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(run) userInfo:nil repeats:NO];
        NSTimer * timer =[[NSTimer alloc] initWithFireDate:[NSDate date] interval:0 target:self selector:@selector(run) userInfo:nil repeats:YES];
        CFRunLoopAddTimer(runLoop, (CFRunLoopTimerRef)timer, kCFRunLoopDefaultMode);
        CFRunLoopRun();
    });

}

-(void)run
{
    NSLog(@"run");
}

  这样我们开启了这个线程的runloop 和 把这个run起来。但是上面的代码中需要注意的是:[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(run) userInfo:nil repeats:NO];注销了,因为这段代码是针对mian线程的。如果你这样写的话仍然不能打印字符串

  如果有什么不足希望大家留言!

时间: 2024-08-09 22:01:04

RunLoop在main线程和自己创建的线程如何启动的相关文章

QT线程(一):线程类

线程之间共享数据,但又单独执行: QT线程QThread是平台无关的: 通常主线程从main开始执行,而在主线程中创建其他线程,其他线程派生于QThread: 1.线程优先级 总共8个优先级:线程优先级从上到下越来越高. Constant Value Description QThread::IdlePriority 0 scheduled only when no other threads are running. QThread::LowestPriority 1 scheduled le

线程(Thread)、线程池(ThreadPool)技术

线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数,在一个应用程序中,常常需要使用多个线程来处理不同的事情,这样可以提高程序的运行效率,也不会使主界面出现无响应的情况.在这里主要介绍线程(Thread).线程池(ThreadPool)两种不同创建线程的区别 在通常的情况下,当我们需要开启一个新的线程时,我们直接通过Thread(继承自 System.Threading;)去创建

Android线程管理之ThreadPoolExecutor自定义线程池(三)

前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己来自定义一个线程池,今天来学习一下ThreadPoolExecutor,然后结合使用场景定义一个按照线程优先级来执行的任务的线程池. ThreadPoolExecutor ThreadPoolExecutor线程池用于管理线程任务队列.若干个线程. 1.)ThreadPoolExecutor构造函数

线程池的创建

package com.newer.cn; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test1 { public static void main(String[] args) { // 创建线程池的方式 // 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程. E

多线程——创建新线程

一,简单单线程 线程是代码的执行序列或者执行路径.线程与进程的概念有一些类似,它类似于一个轻量级的进程:一个操作系统可以运行多个进程,一个进程内可以运行多个线程.每个应用程序至少运行在一个线程上.当只有一个线程时,称作单线程应用程序,该线程由系统自动创建. 下面看一个简单单线程例子: 如上图,本短程序从入口函数main进入,然后一次执行到结束. 执行main方法的线程通常被成为主线程,主线程的入口也是应用程序的起始点.对于单线程的应用程序来说,代码的执行是顺序的. 但是在多线程中,当新线程被手动

java5线程池详解与Executors类创建不同线程池的用法

java中的线程池是非常重要的,它可以节省资源开销,从而提升程序的性能.向Tomcat等一些web服务器都必须用到线程池.java5中为我们提供了一些应用线程池的API,下面的代码将详解其用法. package hxl.insist; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorSer

JVM最多可创建多少线程

JVM可支持的最大线程数 JVM最大线程数 (2012-07-04 23:20:15) 转载▼ 标签: jvm 最大线程数 it 分类: java分布式总结 摘自:http://sesame.iteye.com/blog/622670 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows

【java并发】传统线程技术中创建线程的两种方式

传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面我们来详细分析一下这两种方法的来龙去脉. 1. 揭秘Thread中run()方法 上面我们看到这两种方式都跟run()方法有关,所以我们来看一下Thread的源码中run()方法到底都干了什么: @Override public void run()

GCD12 :创建并发线程 和 调用后台线程

问题: 你想在程序中运行单独的任务时,拥有最大的控制权.例如,你想要根据用户要求,来运行一个长计算请求,同时,主线程 UI 可以自由的与用户交互和做别的事情. 讨论: 在程序中使用线程: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *fileToDownload = @"http://www.