一、进程与线程
1、进程和线程
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位,相当于一个容器。进程之间的切换代价较高。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
线程与进程切换的区别:线程完全共享相同的地址空间,切换代价低。而进程的地址空间是独立的,切换代价高。
2、单线程与多线程
一个进程内只有一个线程称为单线程,且该进程内的数据通常加载在同一内存中。
多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径,多个线程通常共享同意内存中的数据。
二、创建线程
如何创建一个线程呢,这就需要用到NSThread这个类了。一下为创建线程的几个步骤:
1、手动调用start方法开启
2、直接生成一个线程并启动
3、创建一个NSThread工程
下面列举一个简单的例子
1、先创建一个空的工程,然后创建一个继承UIViewController的类YueViewController
2、在AppDelegate.m中,在
application didFinishLaunchingWithOptions:方法中添加代码,如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
YueViewController *viewController = [[YueViewController alloc]initWithNibName:nil bundle:nil];
UITabBarController *pTabbarVC = [[UITabBarController alloc]init];
pTabbarVC.viewControllers = [NSArray arrayWithObjects:viewController, nil];
self.window.rootViewController = pTabbarVC;
[pTabbarVC release];
[viewController release];
[self.window makeKeyAndVisible];
return YES;
}
在新创建的YueViewController.xib文件中,添加几个控件,并将它们关联到YueViewController.h中
在YueViewController.m文件中的代码如下:
#import "YueViewController.h"
@interface YueViewController ()
@end
@implementation YueViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.tabBarItem.title = @"Thread_1";
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
//设置当前进度条的进度
self.myProgressView.progress = 0;
//设置文本
self.labelResult.text = [NSString stringWithFormat:@"%.2f",self.myProgressView.progress];
}
- (IBAction)buttonPressed:(id)sender
{
//设置按钮的状态为隐藏状态
self.btnStart.hidden = YES;
//创建一个自动执行的线程出来
[NSThread detachNewThreadSelector:@selector(startTheBackGroundJob:) toTarget:self withObject:nil];
}
//子线程开启的方法
- (void)startTheBackGroundJob:(id)sender
{
[self performSelectorOnMainThread:@selector(updateProgressView:) withObject:nil waitUntilDone:NO];
}
//完成界面的更新
- (void)updateProgressView:(id)sender
{
//让进度条完成增加
self.myProgressView.progress += 0.1;
//临时变量获取进度条的值
float value = self.myProgressView.progress;
//根据该值进行判断是否(进行重复调用,递归压栈的操作形式)
if (value < 1)
{
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgressView:) userInfo:nil repeats:YES];
}
else
{
self.btnStart.hidden = NO;
}
//更近界面进度条的显示结果
self.labelResult.text = [NSString stringWithFormat:@"%.2f",value];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc {
[_labelResult release];
[_myProgressView release];
[_btnStart release];
[super dealloc];
}
@end
之后运行,就可以了。