NSThread也是iOS实现多线程的一种解决方案,是objc语言。线程的生命周期也是程序员管理。
- 一个NSThread对象就是一个线程。
- 用NSThread创建线程有三种方法。
方法1:
- (void)createThread1
{
// 创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:@"http://b.png"];
//给线程设置名字
thread.name = @"下载线程";
// 启动线程(调用self的download方法)
[thread start];
}
- 这种方法的特点是可以拿到线程对象thread,可以对此对象进行一些操作,如设置名字等。
- 注意:创建线程对象之后要调用-start操作,才会开启线程。
方法2:
- (void)createThread2
{
[NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"http://a.jpg"];
}
- 这种方式创建线程可以直接启动,但是不能拿到线程对象。
方法3:
- (void)createThread3
{
[self performSelectorInBackground:@selector(download:) withObject:@"http://c.gif"];
}
- 这个方法是隐式的创建新的线程,并开启线程进行对应的操作。
- 注意方法中的
InBackground
,这个方法区别于下面的方法。
[self performSelector:@selector(download:) withObject:@"http://c.gif"];
开启线程调用的download方法实现如下:
- (void)download:(NSString *)url
{
NSLog(@"下载东西---%@---%@", url, [NSThread currentThread]);
}
- 这个方法就是模拟下载操作,并且打印当前线程,在
方法1
中调用此方法会会打印出线程的名字是下载线程
有的时候我们b不知道当前的线程是主线程还是子线程,这时候就可以调用方法[NSThread currentThread];
来判断。
另外可以调用方法[NSThread mainThread];
来拿到主线程进行线程之间的通信,那么什么是线程间通信呢?
线程间通信