iOS 如何创建一个线程,要求可以一直工作,不会执行一次就结束

来源:互联网 发布:淘宝闲鱼自提怎么交易 编辑:程序博客网 时间:2024/04/27 17:12

http://blog.csdn.net/hu_songsong/article/details/12845391

http://www.dreamingwish.com/frontui/article/default/ios-multithread-program-runloop-the.html

如何创建一个线程,要求可以一直工作,不会执行一次就结束。

@synthesize name;- (void)viewDidLoad{    [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadFunc) object:nil];    [thread start];}static bool over = NO;- (void)threadFunc{    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];    while (YES) {        @synchronized(name){            name = @"Frank";            [NSThread sleepForTimeInterval:2];            if ([NSThread isMultiThreaded]) {                NSLog(@"%@ isMultiThreaded",name);            }            if (over) {                break;            }        }    }    [pool release];}


.结束这个线程:

    a)break;

    b)[thread cancel]


NSRunloop

一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。NSRunloop可以保持一个线程一直为活跃状态,不会马上销毁。

在多线程中使用定时器必须开启Runloop,因为只有开启Runloop保持线程为活跃状态,定时器才能运行正常。

- (void)viewDidLoad{    [super viewDidLoad];    //self.view.backgroundColor=[UIColor blueColor];    [self performSelectorInBackground:@selector(multithread) withObject:nil];}-(void)multithread{    NSLog(@"HE");    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];    [[NSRunLoop currentRunLoop]run];}-(void)timeAction{    NSLog(@"HELLO");}

1.3.4    退出Run Loop

有两种方法可以让run loop处理事件之前退出:

  • 给run loop设置超时时间
  • 通知run loop停止

如果可以配置的话,推荐使用第一种方法。指定一个超时时间可以使run loop退出前完成所有正常操作,包括发送消息给run loop观察者。

使用CFRunLoopStop来显式的停止run loop和使用超时时间产生的结果相似。Run loop把所有剩余的通知发送出去再退出。与设置超时的不同的是你可以在无条件启动的run loop里面使用该技术。

尽管移除run loop的输入源和定时器也可能导致run loop退出,但这并不是可靠的退出run loop的方法。一些系统例程会添加输入源到run loop里面来处理所需事件。因为你的代码未必会考虑到这些输入源,这样可能导致你无法没从系统例程中移除它们,从而导致退出run loop。


0 0
原创粉丝点击