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

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。


你可能感兴趣的:(iOS_OC)