线程之--- 消息循环

关于消息循环其实一直在用,但是还是不太懂,总结如下:

     

     理论部分:

      一个run loop 就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用run loop 的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。 

         Run loop的管理并不完全自动的。你仍然需要设计你的线程代码在合适的时候启动 run loop并正确响应输入事件。你的应用程序不需要显式的创建这些对象(run loop objects);每个线程,包括程序的主线程都有与之对应的run loopobject

    

    上图显示了run loop 的概念结构以及各种源。输入源传递异步消息给相应的处理例程,并调用runUntilDate:方法来退出(在线程里面相关的NSRunLoop 对象调用)。定时源则直接传递消息给处理例程,但并不会退出run loop;

      

        实践:

    self.socket_state = 10;
    //当前时间
    double nowTime = [[NSDate date] timeIntervalSince1970];
    double  t2 = nowTime +  12;
    //超时 发现状态改变
    NSLog(@"消息循环开始");
    while (self.socket_state == 10 &&[[NSDate date] timeIntervalSince1970] < t2)
    {
        NSLog(@"消息循环执行--时间差 %f",t2-[[NSDate date] timeIntervalSince1970] );
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:20]];
    }
    NSLog(@"阻塞结束");
 /*
 2014-02-26 14:44:15.954 RunLoopTest[1639:a0b] 消息循环开始
 2014-02-26 14:44:15.955 RunLoopTest[1639:a0b] 消息循环执行--时间差 11.998502
 2014-02-26 14:44:15.957 RunLoopTest[1639:a0b] 消息循环执行--时间差 11.996921
 2014-02-26 14:44:16.173 RunLoopTest[1639:a0b] 消息循环执行--时间差 11.780940
 2014-02-26 14:44:36.173 RunLoopTest[1639:a0b] 阻塞结束
 */
     

    self.socket_state = 10;
    [self performSelector:@selector(changeValue) withObject:Nil afterDelay:10];
    //当前时间
    double nowTime = [[NSDate date] timeIntervalSince1970];
    double  t2 = nowTime +  12;
    //超时 发现状态改变
    NSLog(@"消息循环开始");
    while (self.socket_state == 10 &&[[NSDate date] timeIntervalSince1970] < t2)
    {
        NSLog(@"消息循环执行--时间差 %f",t2-[[NSDate date] timeIntervalSince1970] );
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:20]];
    }
    NSLog(@"阻塞结束");  

-(void)changeValue

{

    self.socket_state = 2;

}

//2014-02-26 14:50:40.851 RunLoopTest[1671:a0b] 消息循环开始

//2014-02-26 14:50:40.852 RunLoopTest[1671:a0b] 消息循环执行--时间差 11.998650

//2014-02-26 14:50:40.854 RunLoopTest[1671:a0b] 消息循环执行--时间差 11.997078

//2014-02-26 14:51:00.001 RunLoopTest[1671:a0b] 阻塞结束


分析:消息循环阻塞当前的代码块,不停的去检查判断条件,当不满足要求的时候,阻塞结束;或者阻塞时间超时,阻塞结束。

在此过程中,此线程可以接收来自button等的点击事件。

     也就是告诉计算机在while过程中可以接收哪些输入源的信息。

如果没有消息,循环,计算机,会无限循环,不在接收其他指令。

     其他更深层的内容见:

   《多线程编程指南 》

     多线程需要考虑的东西:

    线程安全:     多线程通信 ----  多线程修改同一个数据----数据同步

    线程调度:    工作--- 休眠 --- 工作

    线程内存:    自动释放池

   多线程管理: 队列


     


     

    


        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值