博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LHF Objective-C语法(12)多线程
阅读量:5037 次
发布时间:2019-06-12

本文共 2353 字,大约阅读时间需要 7 分钟。

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)线程池

转载于:https://www.cnblogs.com/landebug/archive/2012/02/15/2416666.html

你可能感兴趣的文章
C#正则表达式引发的CPU跑高问题以及解决方法
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了...
查看>>
APScheduler调度器
查看>>
设计模式——原型模式
查看>>
【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
查看>>
如何一个pdf文件拆分为若干个pdf文件
查看>>
web.xml中listener、 filter、servlet 加载顺序及其详解
查看>>
前端chrome浏览器调试总结
查看>>
获取手机验证码修改
查看>>
数据库连接
查看>>
python中数据的变量和字符串的常用使用方法
查看>>
等价类划分进阶篇
查看>>
delphi.指针.PChar
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
java 字符串转json,json转对象等等...
查看>>
极客前端部分题目收集【索引】
查看>>
第四天 selenium的安装及使用
查看>>
关于js的设计模式(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)...
查看>>
KMPnext数组循环节理解 HDU1358
查看>>
android调试debug快捷键
查看>>