一 创建和启动
创建和启动(推荐使用):
NSThread *thread = [[NSThreadalloc]initWithTarget:selfselector:@selector(download)object:nil];
thread.name =@"下载线程";
[thread start];
参数分析:调用方法、传递参数
PS:init方法后仅仅是创建了线程对象,需要通过start方法将线程对象放入可调用线程池。一个NSThread对象代表一条线程。
其他两种常用线程的方法:
创建线程并自动启动:
[NSThreaddetachNewThreadSelector:@selector(download)toTarget:selfwithObject:nil];
隐式创建线程并启动:
[selfperformSelectorInBackground:@selector(download)withObject:nil];
分析:两种方法创建线程更为快捷,但是两者方法返回都为void即没有返回线程对象,无法对线程进行一些操作。
二 线程状态
New:新建:通过init方法创建的线程对象还未进入可调度线程池。
Runnable:就绪:使用start方法、线程进入可调度线程池中。或CPU调度完当前线程后,转而调度其他线程。(CPU一次只能运行一个线程。只用调度够快可以产生多线程同时运行的效果)或slepp到时,得到互斥锁。
Running:运行时:CPU调度到当前线程,线程运行。
Blocked:堵塞:在running状态调用了sleep方法,线程进入睡眠等待互斥锁。
Dead:死亡:线程执行完毕,或者异常、强制退出。PS:线程对象Dead后不能再次执行,想要再次执行需要重新创建线程。
三 线程间通信
从其他线程回到主线程:
[self performSelectorOnMainThread:@selector(mySetView:) withObject:date waitUntilDone:YES];
分析:
第三个参数:是否等待主线程执行完再执行自线程中接下来的内容。
从某个线程跳到其他线程:
- (void)performSelector:(SEL)aSelectoronThread:(NSThread thrwithObject:(id)arg waitUntilDone:(BOOL)wait;