有时候可能有很多功能要同时实现,例如每隔多长时间就会检测程序网络连接,又或者有时候需要从服务器下载一个不小的文件,如果用单线程几乎是不可想的事情,程序将会卡的无法使用,用到多线程和不用多线程,给用户的体验天壤之别,所以多线程是一个ios开发人员必须学会的一个知识点。
多线程,听得有点高深,其实很简单。在iphone中,多线程可以这么理解,除主线程外还有其他线程,主线程和其他线程的区别是最重要的,最简单的理解方法就是主线程会改变界面,其他线程不会改变,主线程可以调用其他线程,
1.声明一个线程又两种方法:1.thread1=[[NSThread alloc]initWithTarget:self selector:@selector(tt1) object:nil];这种方法必须启动 [thread1 start];
2.[NSThread detachNewThreadSelector:@selector(tt1) toTarget:self withObject:nil];这种方法不需要声明NSThread对象,也不需要启动,默认执行到这句就直接运行了
2.当程序在后台执行时,可能有时候需要调用另外的方法,这个方法名是[self performSelectorInBackground:@Selector(threadMethod) withObject:nil]
3.设置线程优先级-(void)setThreadPriority:(double)priority;线程优先级是从0.0到1.0,1.0是最高优先级。系统默认的优先级是0.5
4.线程休眠:+(void)sleepForTimeInterval:(NSTimeInterval)time;time参数为休眠时间。
5.线程的交互:线程的运行过程中,可能需要与其他线程进行通信,如在主线程中修改界面等等,可以使用如下接口:-(void)performSelectorOnMainThread:(SEL)Selectoe withObject:(id)arg waitUntilDone:(bool)wait;
6.线程的同步和线程琐,可以了解下
7.线程池,可以了解下
用多线程实现一个简单的程序
#import <UIKit/UIKit.h>
@interface toolbar_1ViewController : UIViewController {
UILabel * l1;
UILabel * l2;
UILabel * l3;
UILabel * l4;
UILabel * l5;
UIButton *b1;
UIButton *b2;
UIButton *b3;
UIButton *b4;
UIButton *b5;
NSThread *thread1;
NSThread *thread2;
NSThread *thread3;
NSThread *thread4;
bool button1;
bool button2;
bool button3;
bool button4;
bool button5;
int i1;
int i2;
int i3;
int i4;
int i5;
NSCondition *lock;
}
@property (nonatomic,retain)IBOutlet UILabel *l1;
@property (nonatomic,retain)IBOutlet UILabel *l2;
@property (nonatomic,retain)IBOutlet UILabel *l3;
@property (nonatomic,retain)IBOutlet UILabel *l4;
@property (nonatomic,retain)IBOutlet UILabel *l5;
@property (nonatomic,retain)IBOutlet UIButton *b1;
@property (nonatomic,retain)IBOutlet UIButton *b2;
@property (nonatomic,retain)IBOutlet UIButton *b3;
@property (nonatomic,retain)IBOutlet UIButton *b4;
@property (nonatomic,retain)IBOutlet UIButton *b5;
-(IBAction)b1:(id)sender;
-(IBAction)b2:(id)sender;
-(IBAction)b3:(id)sender;
-(IBAction)b4:(id)sender;
-(IBAction)b5:(id)sender;
-(void)t1;
-(void)tt1;
-(void)t2;
-(void)tt2;
-(void)t3;
-(void)tt3;
-(void)t4;
-(void)tt4;
-(void)changeAll;
@end
#import "toolbar_1ViewController.h"
@implementation toolbar_1ViewController
@synthesize l1;
@synthesize l2;
@synthesize l3;
@synthesize l4;
@synthesize l5;
@synthesize b1;
@synthesize b2;
@synthesize b3;
@synthesize b4;
@synthesize b5;
-(IBAction)b1:(id)sender
{
thread1=[[NSThread alloc]initWithTarget:self selector:@selector(tt1) object:nil];
button1=!button1;
if(button1){
[b1 setTitle:@"停止1" forState:UIControlStateNormal] ;
[self changeAll];
[thread1 start];
}
else {
[b1 setTitle:@"启动1" forState:UIControlStateNormal] ;
[self changeAll];
[thread1 cancel];
}
}
-(void)changeAll
{
if (button1&&button2&button3&button4) {
[b5 setTitle:@"停止全部" forState:UIControlStateNormal] ;
button5=YES;
}
if (!button1&&!button2&!button3&!button4) {
[b5 setTitle:@"启动全部" forState:UIControlStateNormal] ;
button5=NO;
}
}
-(void)tt1
{
while (button1) {
[self performSelectorOnMainThread:@selector(t1) withObject:nil waitUntilDone:NO];
[NSThread sleepForTimeInterval:1.0];
}
}
-(void)t1
{
l1.text=[NSString stringWithFormat:@"%d",++i1];
[lock lock];
i5 ++ ;
[lock unlock];
l5.text=[NSString stringWithFormat:@"%d",i5];
[self.view setNeedsDisplay];
}
-(IBAction)b2:(id)sender
{
thread2=[[NSThread alloc]initWithTarget:self selector:@selector(tt2) object:nil];
button2=!button2;
if(button2){
[b2 setTitle:@"停止2" forState:UIControlStateNormal] ;
[self changeAll];
[thread2 start];
}
else {
[b2 setTitle:@"启动2" forState:UIControlStateNormal] ;
[self changeAll];
[thread2 cancel];
}
}
-(void)tt2
{
while (button2) {
[self performSelectorOnMainThread:@selector(t2) withObject:nil waitUntilDone:NO];
[NSThread sleepForTimeInterval:1.0];
}
}
-(void)t2
{
l2.text=[NSString stringWithFormat:@"%d",++i2];
[lock lock];
i5 ++ ;
[lock unlock];
l5.text=[NSString stringWithFormat:@"%d",i5];
[self.view setNeedsDisplay];
}
-(IBAction)b3:(id)sender
{
thread3=[[NSThread alloc]initWithTarget:self selector:@selector(tt3) object:nil];
button3=!button3;
if(button3){
[b3 setTitle:@"停止3" forState:UIControlStateNormal] ;
[self changeAll];
[thread3 start];
}
else {
[b3 setTitle:@"启动3" forState:UIControlStateNormal] ;
[self changeAll];
[thread3 cancel];
}
}
-(void)tt3
{
while (button3) {
[self performSelectorOnMainThread:@selector(t3) withObject:nil waitUntilDone:NO];
[NSThread sleepForTimeInterval:1.0];
}
}
-(void)t3
{
l3.text=[NSString stringWithFormat:@"%d",++i3];
[lock lock];
i5 ++ ;
[lock unlock];
l5.text=[NSString stringWithFormat:@"%d",i5];
[self.view setNeedsDisplay];
}
-(IBAction)b4:(id)sender
{
thread4=[[NSThread alloc]initWithTarget:self selector:@selector(tt4) object:nil];
button4=!button4;
if(button4){
[b4 setTitle:@"停止4" forState:UIControlStateNormal] ;
[self changeAll];
[thread4 start];
}
else {
[b4 setTitle:@"启动4" forState:UIControlStateNormal] ;
[self changeAll];
[thread4 cancel];
}
}
-(void)tt4
{
while (button4) {
[self performSelectorOnMainThread:@selector(t4) withObject:nil waitUntilDone:NO];
[NSThread sleepForTimeInterval:1.0];
}
}
-(void)t4
{
l4.text=[NSString stringWithFormat:@"%d",++i4];
[lock lock];
i5 ++ ;
[lock unlock];
l5.text=[NSString stringWithFormat:@"%d",i5];
[self.view setNeedsDisplay];
}
-(IBAction)b5:(id)sender
{
if(!button5){
[b5 setTitle:@"停止全部" forState:UIControlStateNormal] ;
if (!button1) {
thread1=[[NSThread alloc]initWithTarget:self selector:@selector(tt1) object:nil];
button1=!button1;
[b1 setTitle:@"停止1" forState:UIControlStateNormal] ;
[thread1 start];
}
if (!button2) {
thread2=[[NSThread alloc]initWithTarget:self selector:@selector(tt2) object:nil];
button2=!button2;
[b2 setTitle:@"停止2" forState:UIControlStateNormal] ;
[thread2 start];
}
if (!button3) {
thread3=[[NSThread alloc]initWithTarget:self selector:@selector(tt3) object:nil];
button3=!button3;
[b3 setTitle:@"停止3" forState:UIControlStateNormal] ;
[thread3 start];
}
if (!button4) {
thread4=[[NSThread alloc]initWithTarget:self selector:@selector(tt4) object:nil];
button4=!button4;
[b4 setTitle:@"停止4" forState:UIControlStateNormal] ;
[thread4 start];
}
}
else{
[b5 setTitle:@"启动全部" forState:UIControlStateNormal] ;
if (button1) {
button1=!button1;
[b1 setTitle:@"启动1" forState:UIControlStateNormal] ;
[thread1 cancel];
}
if (button2) {
button2=!button2;
[b2 setTitle:@"启动2" forState:UIControlStateNormal] ;
[thread2 cancel];
}
if (button3) {
button3=!button3;
[b3 setTitle:@"启动3" forState:UIControlStateNormal] ;
[thread3 cancel];
}
if (button4) {
button4=!button4;
[b4 setTitle:@"启动4" forState:UIControlStateNormal] ;
[thread4 cancel];
}
}
button5=!button5;
}
- (void)dealloc
{
[l1 release];
[l2 release];
[l3 release];
[l4 release];
[l5 release];
[b1 release];
[b2 release];
[b3 release];
[b4 release];
[b5 release];
[thread1 release];
[thread2 release];
[thread3 release];
[thread4 release];
[super dealloc];
}
- (void)viewDidLoad
{
i1=0;
button1=false;
button2=false;
button3=false;
button4=false;
button5=false;
i5=i2=i3=i4=i1;
l1.text=[NSString stringWithFormat:@"%d",i1];
l2.text=[NSString stringWithFormat:@"%d",i2];
l3.text=[NSString stringWithFormat:@"%d",i3];
l4.text=[NSString stringWithFormat:@"%d",i4];
l5.text=[NSString stringWithFormat:@"%d",i5];
}
@end
XIB文件如下