1、NSThread
(1)创建线程对象的方法:
a、-(id) init;
b、-(id) initWithTarget:(id) target selector:(SEL) selector object:(id) argument;
c、+(void) detachNewThreadSelector:(SEL) aSelector toTarget:(id) aTarget withObject:(id) anArgument //使用这个类方法,不用release(因为没有使用alloc)
启动一个线程用star,结束一个线程用exit(使用exit时,首先要将这个线程的引用计数归0)
(2)NSCondition 执行同步操作,相当于java的lock
(3)@synchronized(要加锁的对象){
//同步执行的代码
}
例1:
//SellTickets.h========================= #import <Foundation/Foundation.h> @interface SellTickets : NSObject{ int tickets; //未售出的票数 int count; //售出的票数 NSThread *ticketsThread1; //线程1 NSThread *ticketsThread2; //线程2 NSThread *ticketsThread3; //线程3 NSCondition *ticketsCondition; //同步锁 } -(void) ticket;//售票方法 @end #import "SellTickets.h" @implementation SellTickets -(void) ticket{ tickets = 100; count = 0; ticketsCondition = [[NSCondition alloc] init]; ticketsThread1 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [ticketsThread1 setName:@"Thread-1"]; [ticketsThread1 start]; ticketsThread2 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [ticketsThread2 setName:@"Thread-2"]; [ticketsThread2 start]; ticketsThread3 = [[NSThread alloc] initWithTarget:self selector:@selector(asyn) object:nil]; [ticketsThread3 setName:@"Thread-3"]; [ticketsThread3 start]; [NSThread sleepForTimeInterval:80];//让主线程暂停80秒 } //线程之间是否异步执行 //按照asyn中的代码,在程序5秒后,线程3会夹杂在线程1、2的售票输出语句中输出 -(void)asyn{ [NSThread sleepForTimeInterval:5]; NSLog(@"*******************************"); } -(void)run{ while(YES){ //上锁 [ticketsCondition lock]; if(tickets >0){ [NSThread sleepForTimeInterval:0.5]; count = 100 - tickets; NSLog(@"当前票数%d,售出%d,线程名%@",tickets,count, [[NSThread currentThread] name]); tickets--; }else{ break; } //解锁 [ticketsCondition unlock]; } } -(void)dealloc{ //回收线程,同步锁的实例 [ticketsThread1 release]; [ticketsThread2 release]; [ticketsThread3 release]; [ticketsCondition release]; [super dealloc]; } @end#import <Foundation/Foundation.h> #import "SellTickets.h" int main (int argc, const char * argv[]) { SellTickets *st = [[SellTickets alloc] init]; [st ticket]; [st release]; return 0; }(4)与主线程交互
如果想更新UI上的某一个部件,就需要在发起的新线程里调用UI所在的主线程上的一个方法,新线程不能直接访问主线程的方法,需要在润方法中使用如下方法
[self performSelectorOnMainThread:@selector(moveText) withObject:nil waitUntilDone:NO];
(3)线程池