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");
}
有两种方法可以让run loop处理事件之前退出:
如果可以配置的话,推荐使用第一种方法。指定一个超时时间可以使run loop退出前完成所有正常操作,包括发送消息给run loop观察者。
使用CFRunLoopStop来显式的停止run loop和使用超时时间产生的结果相似。Run loop把所有剩余的通知发送出去再退出。与设置超时的不同的是你可以在无条件启动的run loop里面使用该技术。
尽管移除run loop的输入源和定时器也可能导致run loop退出,但这并不是可靠的退出run loop的方法。一些系统例程会添加输入源到run loop里面来处理所需事件。因为你的代码未必会考虑到这些输入源,这样可能导致你无法没从系统例程中移除它们,从而导致退出run loop。