- 浏览: 1341331 次
- 性别:
- 来自: 成都
-
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
利用iphone的多线程实现“售票系统”(手把手教你iphone开发 - 基础篇)
作者:孙东风 2009-11-10 (请尊重作者劳动成果,转载务必注明出处)
http://blog.csdn.net/dongfengsun/archive/2009/11/10/4794010.aspx
Java 因为其本身支持多线程而给程序员带来很多方便,其实在 iphone 的开发中也支持多线程编程,并且一点也不比 java 麻烦。
在这篇文章中,笔者就拿大多数 Java 教程中经典的“售票系统多线程”作为实际例子,在 iphone 中进行同样的实现。
下面是 java 版本的“售票系统多线程”代码:
package demo;
public class SellTickets implements Runnable{
private int tickets=100;
public void run() {
int count=0;
while (true)
{
// 上锁
synchronized(this){
if (tickets>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
count=100-tickets;
System.out.println(" 当前票数是 :"+tickets+" 售出 "+count
+" 线程名: "+Thread.currentThread().getName());
tickets--;
}else{
break;
}
}
}
}
public static void main(String[] args) {
SellTickets r=new SellTickets();
Thread t1=new Thread(r,"t1");
t1.start();
Thread t2=new Thread(r,"t2");
t2.start();
Thread t3=new Thread(r,"t3");
t3.start();
Thread t4=new Thread(r,"t4");
t4.start();
}
}
以上 java 版本的代码执行后控制台输出如下:
当前票数是 :100 售出 0 线程名: t1
当前票数是 :99 售出 1 线程名: t2
当前票数是 :98 售出 2 线程名: t3
当前票数是 :97 售出 3 线程名: t4
当前票数是 :96 售出 4 线程名: t1
当前票数是 :95 售出 5 线程名: t2
当前票数是 :94 售出 6 线程名: t3
当前票数是 :93 售出 7 线程名: t4
当前票数是 :92 售出 8 线程名: t1
当前票数是 :91 售出 9 线程名: t2
当前票数是 :90 售出 10 线程名: t3
当前票数是 :89 售出 11 线程名: t4
当前票数是 :88 售出 12 线程名: t1
当前票数是 :87 售出 13 线程名: t2
当前票数是 :86 售出 14 线程名: t3
当前票数是 :85 售出 15 线程名: t4
当前票数是 :84 售出 16 线程名: t1
当前票数是 :83 售出 17 线程名: t2
当前票数是 :82 售出 18 线程名: t3
当前票数是 :81 售出 19 线程名: t4
当前票数是 :80 售出 20 线程名: t1
当前票数是 :79 售出 21 线程名: t2
当前票数是 :78 售出 22 线程名: t3
当前票数是 :77 售出 23 线程名: t4
当前票数是 :76 售出 24 线程名: t1
当前票数是 :75 售出 25 线程名: t2
当前票数是 :74 售出 26 线程名: t3
当前票数是 :73 售出 27 线程名: t4
……
可以在 iphone 中进行同样的实现, Iphone 的 Frameworks/Foundation.framework 框架支持多线程编程,接口定义在 :
/Xcode3.1.4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSThread.h
到相应的目录下打开此文件,可以看到绝大多数 java 中的接口这里也都能找到相应的实现,如下:
/* NSThread.h
Copyright (c) 1994-2007, Apple Inc. All rights reserved.
*/
#import <Foundation/NSObject.h>
#import <Foundation/NSDate.h>
@class NSArray, NSMutableDictionary, NSDate;
@interface NSThread : NSObject {
@private
id _private;
uint8_t _bytes[44];
}
+ (NSThread *)currentThread;
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
+ (BOOL)isMultiThreaded;
- (NSMutableDictionary *)threadDictionary;
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
+ (void)exit;
#if MAC_OS_X_VERSION_10_2 <= MAC_OS_X_VERSION_MAX_ALLOWED
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
#endif
#if MAC_OS_X_VERSION_10_5 <= MAC_OS_X_VERSION_MAX_ALLOWED
+ (NSArray *)callStackReturnAddresses;
- (void)setName:(NSString *)n;
- (NSString *)name;
- (NSUInteger)stackSize;
- (void)setStackSize:(NSUInteger)s;
- (BOOL)isMainThread;
+ (BOOL)isMainThread; // reports whether current thread is main
+ (NSThread *)mainThread;
- (id)init; // designated initializer
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
- (BOOL)isExecuting;
- (BOOL)isFinished;
- (BOOL)isCancelled;
- (void)cancel;
- (void)start;
- (void)main; // thread body method
#endif
@end
FOUNDATION_EXPORT NSString * const NSWillBecomeMultiThreadedNotification;
FOUNDATION_EXPORT NSString * const NSDidBecomeSingleThreadedNotification;
FOUNDATION_EXPORT NSString * const NSThreadWillExitNotification;
@interface NSObject (NSThreadPerformAdditions)
#if MAC_OS_X_VERSION_10_2 <= MAC_OS_X_VERSION_MAX_ALLOWED
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
// equivalent to the first method with kCFRunLoopCommonModes
#endif
#if MAC_OS_X_VERSION_10_5 <= MAC_OS_X_VERSION_MAX_ALLOWED
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
// equivalent to the first method with kCFRunLoopCommonModes
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;
#endif
@end
从接口的定义中可以知道, NSThread 和大多数 iphone 的接口对象一样,有两种方式可以初始化:
一种使用 initWithTarget :(id)target selector:(SEL)selector object:(id)argument, 但需要负责在对象的 retain count 为 0 时调用对象的 release 方法清理对象。
另一种则使用所谓的 convenient method, 这个方便接口就是 detachNewThreadSelector, 这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。
因为在笔者的 iphone 版本“售票系统多线程”程序中需要设置线程的诸多参数,所以需要采用第一种方法来生成线程对象并自己启动它们。
首先,新建一个“ Window-based Application ”项目,并命名为 SellTickets ,接下来在 SellTicketsAppDelegate.h 文件中声明以下变量:
//
// SellTicketsAppDelegate.h
// SellTickets
//
// Created by sun dfsun2009 on 09-11-10.
// Copyright __MyCompanyName__ 2009. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> {
int tickets;
int count;
NSThread* ticketsThreadone;
NSThread* ticketsThreadtwo;
UIWindow *window;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
笔者在头文件中声明了两个 NSThread 的指针,下面需要在 *.m 文件中初始化并实现它们,如下:
//
// SellTicketsAppDelegate.m
// SellTickets
//
// Created by sun dfsun2009 on 09-11-10.
// Copyright __MyCompanyName__ 2009. All rights reserved.
//
#import "SellTicketsAppDelegate.h"
@implementation SellTicketsAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tickets = 100;
count = 0;
ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadone setName:@"Thread-1"];
[ticketsThreadone start];
ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadtwo setName:@"Thread-2"];
[ticketsThreadtwo start];
//[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
- (void)run{
while (TRUE) {
if(tickets > 0)
{
[NSThread sleepForTimeInterval:0.5];
count = 100 - tickets;
NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]);
tickets--;
}else
{
break;
}
}
}
- (void)dealloc {
[ticketsThreadone release];
[ticketsThreadtwo release];
[window release];
[super dealloc];
}
@end
笔者在实现中用 alloc 初始化了两个 NSThread 对象并分别把它们命名为“ Thread-1 ”和“ Thread-2 ”,运行程序可以看到如下输出:
[Session started at 2009-11-10 14:25:26 +0800.]
2009-11-10 14:25:28.814 SellTickets[1298:4103] 当前票数是 :100, 售出 :0, 线程名 :Thread-1
2009-11-10 14:25:28.814 SellTickets[1298:4203] 当前票数是 :100, 售出 :0, 线程名 :Thread-2
2009-11-10 14:25:29.316 SellTickets[1298:4103] 当前票数是 :98, 售出 :2, 线程名 :Thread-1
2009-11-10 14:25:29.316 SellTickets[1298:4203] 当前票数是 :98, 售出 :2, 线程名 :Thread-2
2009-11-10 14:25:29.817 SellTickets[1298:4103] 当前票数是 :96, 售出 :4, 线程名 :Thread-1
2009-11-10 14:25:29.817 SellTickets[1298:4203] 当前票数是 :96, 售出 :4, 线程名 :Thread-2
2009-11-10 14:25:30.318 SellTickets[1298:4103] 当前票数是 :94, 售出 :6, 线程名 :Thread-1
2009-11-10 14:25:30.318 SellTickets[1298:4203] 当前票数是 :94, 售出 :6, 线程名 :Thread-2
2009-11-10 14:25:30.819 SellTickets[1298:4103] 当前票数是 :92, 售出 :8, 线程名 :Thread-1
2009-11-10 14:25:30.819 SellTickets[1298:4203] 当前票数是 :92, 售出 :8, 线程名 :Thread-2
2009-11-10 14:25:31.320 SellTickets[1298:4103] 当前票数是 :90, 售出 :10, 线程名 :Thread-1
2009-11-10 14:25:31.320 SellTickets[1298:4203] 当前票数是 :90, 售出 :10, 线程名 :Thread-2
2009-11-10 14:25:31.820 SellTickets[1298:4103] 当前票数是 :88, 售出 :12, 线程名 :Thread-1
2009-11-10 14:25:31.821 SellTickets[1298:4203] 当前票数是 :87, 售出 :13, 线程名 :Thread-2
2009-11-10 14:25:32.321 SellTickets[1298:4103] 当前票数是 :86, 售出 :14, 线程名 :Thread-1
2009-11-10 14:25:32.322 SellTickets[1298:4203] 当前票数是 :86, 售出 :14, 线程名 :Thread-2
2009-11-10 14:25:32.823 SellTickets[1298:4103] 当前票数是 :84, 售出 :16, 线程名 :Thread-1
2009-11-10 14:25:32.823 SellTickets[1298:4203] 当前票数是 :83, 售出 :17, 线程名 :Thread-2
2009-11-10 14:25:33.323 SellTickets[1298:4103] 当前票数是 :82, 售出 :18, 线程名 :Thread-1
2009-11-10 14:25:33.324 SellTickets[1298:4203] 当前票数是 :81, 售出 :19, 线程名 :Thread-2
2009-11-10 14:25:33.824 SellTickets[1298:4103] 当前票数是 :80, 售出 :20, 线程名 :Thread-1
2009-11-10 14:25:33.825 SellTickets[1298:4203] 当前票数是 :79, 售出 :21, 线程名 :Thread-2
2009-11-10 14:25:34.325 SellTickets[1298:4103] 当前票数是 :78, 售出 :22, 线程名 :Thread-1
2009-11-10 14:25:34.326 SellTickets[1298:4203] 当前票数是 :77, 售出 :23, 线程名 :Thread-2
2009-11-10 14:25:34.826 SellTickets[1298:4103] 当前票数是 :76, 售出 :24, 线程名 :Thread-1
2009-11-10 14:25:34.827 SellTickets[1298:4203] 当前票数是 :75, 售出 :25, 线程名 :Thread-2
2009-11-10 14:25:35.327 SellTickets[1298:4103] 当前票数是 :74, 售出 :26, 线程名 :Thread-1
2009-11-10 14:25:35.328 SellTickets[1298:4203] 当前票数是 :73, 售出 :27, 线程名 :Thread-2
2009-11-10 14:25:35.827 SellTickets[1298:4103] 当前票数是 :72, 售出 :28, 线程名 :Thread-1
2009-11-10 14:25:35.830 SellTickets[1298:4203] 当前票数是 :71, 售出 :29, 线程名 :Thread-2
2009-11-10 14:25:36.329 SellTickets[1298:4103] 当前票数是 :70, 售出 :30, 线程名 :Thread-1
2009-11-10 14:25:36.330 SellTickets[1298:4203] 当前票数是 :69, 售出 :31, 线程名 :Thread-2
2009-11-10 14:25:36.830 SellTickets[1298:4103] 当前票数是 :68, 售出 :32, 线程名 :Thread-1
2009-11-10 14:25:36.831 SellTickets[1298:4203] 当前票数是 :67, 售出 :33, 线程名 :Thread-2
2009-11-10 14:25:37.331 SellTickets[1298:4103] 当前票数是 :66, 售出 :34, 线程名 :Thread-1
2009-11-10 14:25:37.332 SellTickets[1298:4203] 当前票数是 :65, 售出 :35, 线程名 :Thread-2
2009-11-10 14:25:37.832 SellTickets[1298:4103] 当前票数是 :64, 售出 :36, 线程名 :Thread-1
2009-11-10 14:25:37.833 SellTickets[1298:4203] 当前票数是 :63, 售出 :37, 线程名 :Thread-2
2009-11-10 14:25:38.333 SellTickets[1298:4103] 当前票数是 :62, 售出 :38, 线程名 :Thread-1
2009-11-10 14:25:38.334 SellTickets[1298:4203] 当前票数是 :61, 售出 :39, 线程名 :Thread-2
2009-11-10 14:25:38.834 SellTickets[1298:4103] 当前票数是 :60, 售出 :40, 线程名 :Thread-1
2009-11-10 14:25:38.836 SellTickets[1298:4203] 当前票数是 :59, 售出 :41, 线程名 :Thread-2
2009-11-10 14:25:39.335 SellTickets[1298:4103] 当前票数是 :58, 售出 :42, 线程名 :Thread-1
2009-11-10 14:25:39.337 SellTickets[1298:4203] 当前票数是 :58, 售出 :42, 线程名 :Thread-2
2009-11-10 14:25:39.838 SellTickets[1298:4103] 当前票数是 :56, 售出 :44, 线程名 :Thread-1
2009-11-10 14:25:39.839 SellTickets[1298:4203] 当前票数是 :55, 售出 :45, 线程名 :Thread-2
2009-11-10 14:25:40.339 SellTickets[1298:4103] 当前票数是 :54, 售出 :46, 线程名 :Thread-1
2009-11-10 14:25:40.340 SellTickets[1298:4203] 当前票数是 :53, 售出 :47, 线程名 :Thread-2
2009-11-10 14:25:40.840 SellTickets[1298:4103] 当前票数是 :52, 售出 :48, 线程名 :Thread-1
2009-11-10 14:25:40.841 SellTickets[1298:4203] 当前票数是 :51, 售出 :49, 线程名 :Thread-2
2009-11-10 14:25:41.341 SellTickets[1298:4103] 当前票数是 :50, 售出 :50, 线程名 :Thread-1
2009-11-10 14:25:41.342 SellTickets[1298:4203] 当前票数是 :49, 售出 :51, 线程名 :Thread-2
2009-11-10 14:25:41.842 SellTickets[1298:4103] 当前票数是 :48, 售出 :52, 线程名 :Thread-1
2009-11-10 14:25:41.843 SellTickets[1298:4203] 当前票数是 :47, 售出 :53, 线程名 :Thread-2
2009-11-10 14:25:42.343 SellTickets[1298:4103] 当前票数是 :46, 售出 :54, 线程名 :Thread-1
2009-11-10 14:25:42.344 SellTickets[1298:4203] 当前票数是 :45, 售出 :55, 线程名 :Thread-2
2009-11-10 14:25:42.844 SellTickets[1298:4103] 当前票数是 :44, 售出 :56, 线程名 :Thread-1
2009-11-10 14:25:42.845 SellTickets[1298:4203] 当前票数是 :43, 售出 :57, 线程名 :Thread-2
2009-11-10 14:25:43.345 SellTickets[1298:4103] 当前票数是 :42, 售出 :58, 线程名 :Thread-1
2009-11-10 14:25:43.346 SellTickets[1298:4203] 当前票数是 :42, 售出 :58, 线程名 :Thread-2
2009-11-10 14:25:43.846 SellTickets[1298:4103] 当前票数是 :40, 售出 :60, 线程名 :Thread-1
2009-11-10 14:25:43.847 SellTickets[1298:4203] 当前票数是 :39, 售出 :61, 线程名 :Thread-2
2009-11-10 14:25:44.347 SellTickets[1298:4103] 当前票数是 :38, 售出 :62, 线程名 :Thread-1
2009-11-10 14:25:44.348 SellTickets[1298:4203] 当前票数是 :37, 售出 :63, 线程名 :Thread-2
2009-11-10 14:25:44.848 SellTickets[1298:4103] 当前票数是 :36, 售出 :64, 线程名 :Thread-1
2009-11-10 14:25:44.849 SellTickets[1298:4203] 当前票数是 :35, 售出 :65, 线程名 :Thread-2
2009-11-10 14:25:45.349 SellTickets[1298:4103] 当前票数是 :34, 售出 :66, 线程名 :Thread-1
2009-11-10 14:25:45.350 SellTickets[1298:4203] 当前票数是 :33, 售出 :67, 线程名 :Thread-2
2009-11-10 14:25:45.850 SellTickets[1298:4103] 当前票数是 :32, 售出 :68, 线程名 :Thread-1
2009-11-10 14:25:45.851 SellTickets[1298:4203] 当前票数是 :31, 售出 :69, 线程名 :Thread-2
2009-11-10 14:25:46.350 SellTickets[1298:4103] 当前票数是 :30, 售出 :70, 线程名 :Thread-1
2009-11-10 14:25:46.351 SellTickets[1298:4203] 当前票数是 :29, 售出 :71, 线程名 :Thread-2
2009-11-10 14:25:46.851 SellTickets[1298:4103] 当前票数是 :28, 售出 :72, 线程名 :Thread-1
2009-11-10 14:25:46.853 SellTickets[1298:4203] 当前票数是 :27, 售出 :73, 线程名 :Thread-2
2009-11-10 14:25:47.352 SellTickets[1298:4103] 当前票数是 :26, 售出 :74, 线程名 :Thread-1
2009-11-10 14:25:47.354 SellTickets[1298:4203] 当前票数是 :25, 售出 :75, 线程名 :Thread-2
可以看到,因为两个线程共享变量 tickets 和 count ,开头的输出就产生了异常情况, iphone 虽然没有提供类似 java 下的 synchronized 关键字,但提供了 NSCondition 对象接口。查看 NSCondition 的接口说明可以看出, NSCondition 是 iphone 下的锁对象,所以我们需要让代码成为线程安全的,修改头文件如下:
//
// SellTicketsAppDelegate.h
// SellTickets
//
// Created by sun dfsun2009 on 09-11-10.
// Copyright __MyCompanyName__ 2009. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> {
int tickets;
int count;
NSThread* ticketsThreadone;
NSThread* ticketsThreadtwo;
NSCondition* ticketsCondition;
UIWindow *window;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
然后在实现中添加如下代码:
//
// SellTicketsAppDelegate.m
// SellTickets
//
// Created by sun dfsun2009 on 09-11-10.
// Copyright __MyCompanyName__ 2009. All rights reserved.
//
#import "SellTicketsAppDelegate.h"
@implementation SellTicketsAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tickets = 100;
count = 0;
// 锁对象
ticketCondition = [[NSCondition alloc] init];
ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadone setName:@"Thread-1"];
[ticketsThreadone start];
ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadtwo setName:@"Thread-2"];
[ticketsThreadtwo start];
//[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
- (void)run{
while (TRUE) {
// 上锁
[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 {
[ticketsThreadone release];
[ticketsThreadtwo release];
[ticketsCondition release];
[window release];
[super dealloc];
}
@end
最后千万别忘记在 dealloc 方法中调用对象的 release 进行资源释放,现在再次运行下看看, iphone 版本的“售票系统多线程”程序是否跑起来了:)
发表评论
-
ios 声音合成
2013-08-18 13:20 1308http://stackoverflow.com/ques ... -
__bridge,__bridge_retained和__bridge_transfer的意思,区别与使用 20 三
2012-12-24 01:41 1735使用ARC能帮我们减轻不少内存管理方面的负担,尤其是对用 ... -
CAAnimation
2012-12-23 01:09 2368CAAnimation采用了CAMediaTi ... -
UIViewAnimation动画与Core Animation的CATransition类动画
2012-12-23 01:06 2774使用UIView类函数实现://U ... -
GCD实战2:资源竞争
2012-12-23 01:04 1617转自http://www.dreamingwish.co ... -
GCD实战一:使用串行队列实现简单的预加载
2012-12-22 17:10 2941转自 http://www.dreamingwish.c ... -
GCD介绍(四): 完结
2012-12-22 17:08 1439转自 http://www.dreamingwish.c ... -
GCD介绍(三): Dispatch Sources
2012-12-22 17:07 1681转自 http://www.dreamingwish.com/ ... -
GCD介绍(二): 多核心的性能
2012-12-22 17:05 1230转自http://www.dreamingwish.co ... -
基本概念和Dispatch Queue
2012-12-22 17:03 1422转自 http://www.dreamingwish.c ... -
Best Audio Format for iPhone Audio Programming
2012-12-19 16:26 2612I had never done audio p ... -
LAME 是一个开源的MP3解码编码工具
2012-12-19 13:09 8653MP3 Encoding * 编码MP3文件必须按如下 ... -
sqlite3中的数据类型
2012-12-10 21:37 1360(转)http://www.cnblogs.com/kfqco ... -
ios随机数,and()、random()、arc4random()
2012-11-15 11:06 4746原文:http://bj007.blog.51cto.c ... -
IPHONE GIF 播放的方式
2012-10-11 18:30 1475转 http://blog.csdn.net/zltia ... -
在新线程中使用NSTimer
2012-10-11 18:21 1604转自 http://blog.csdn.net/sjzs ... -
Creating an iPhone Daemon – Part 5
2012-09-02 15:29 1550Creating an iPhone Daemon – ... -
Creating an iPhone Daemon – Part 4
2012-09-02 15:28 1419Creating an iPhone Daemon – ... -
Creating an iPhone Daemon – Part 3
2012-09-02 15:25 1518This is part three of the bl ... -
Creating an iPhone Daemon – Part 2
2012-09-02 15:24 1273Here is part two of the blog ...
相关推荐
在实际开发中,选择合适的多线程实现方式很关键。NSThread适合轻量级的任务,而NSOperationQueue和GCD更适合处理大量并发操作,它们能更好地利用系统资源,提高效率。 综上所述,iPhone开发中的多线程技术提供了...
### iPhone多线程编程知识点详解 #### 一、引言 在iPhone开发中,多线程编程是一项重要的技术。为了提高应用性能与响应性,合理地利用多线程可以显著提升用户体验。本篇将深入探讨iOS环境下的多线程概念、实现方法...
这份"iOS iPhone多线程编程指南"详细讲解了如何在iPhone平台上有效地进行多线程操作,对于iOS开发者来说是一份宝贵的资源。以下是该指南可能涵盖的关键知识点: 1. **基础概念**:首先,指南会介绍多线程的基本概念...
本文将深入探讨“iPhone开发多线程”这一主题,基于提供的描述和标签,我们将关注iOS平台上的多线程概念、实现方式以及一个名为“ThreadSyncSample”的示例项目。 首先,我们需要理解什么是多线程。在单线程环境中...
3. **iOS下的多线程实现方式** 4. **线程间通信机制** 5. **多线程编程的最佳实践** #### 多线程的基础概念 多线程是指一个程序中包含多个执行路径的技术。在iOS应用开发中,多线程能够有效提高程序的执行效率,并...
在开发一款针对iPhone的音乐应用时,实现"iphone MP3多线程下载 歌曲分类 数据库保存 播放软件"涉及到多个关键的技术环节。首先,我们要关注的是多线程下载技术,这是提高下载效率和用户体验的重要手段。 1. **多...
本文将深入探讨如何在iPhone开发中利用多线程进行网络请求和图片下载。 首先,我们来看一下标题中的“多线程网络请求”。在iOS中,网络请求通常采用URLSession进行,它提供了异步处理能力,可以在后台线程中执行,...
本文将深入探讨在iPhone开发中使用Object-C实现多线程的相关知识点。 一、多线程基础 1. 主线程:主线程是应用的入口,负责处理UI更新和用户交互。为了保证界面的流畅,所有的UI操作应该在主线程上进行。 2. 工作...
综上所述,iPhone中线程的使用涉及到多线程技术的选择、线程安全的保障以及合理利用GCD进行任务调度。熟练掌握这些知识点,对于编写高效、稳定的iOS应用至关重要。通过实际操作和实践,你可以更好地理解和运用这些...
首先,我们从Java的售票系统多线程实现开始,然后分析如何在iOS中使用Objective-C和相关框架进行类似的实现。 Java中的售票系统多线程示例代码通常使用Runnable接口来创建可运行的线程任务。在这个任务中,会有一个...
1. **多线程定义**:多线程是一种在单个进程中实现多个代码执行路径的轻量级方法。系统通过调度这些线程在不同的处理器核心上运行,以实现真正的并行处理。 2. **线程的组成**:从技术层面来看,一个线程是由内核级...
在iPhone系统中,多线程的实现通常涉及以下概念: 1. 主线程:负责处理UI更新和用户交互。 2. 子线程:执行非UI相关的任务,如数据加载、计算等。 3. 线程同步与互斥:确保多线程安全访问共享资源,防止数据竞争...
#### 二、多线程实现策略 在iOS开发中,有多种实现多线程的方式,包括`NSThread`、`NSOperation`以及`GCD`(Grand Central Dispatch)。 1. **NSThread** - **应用场景**:适用于需要将Objective-C中的某个方法放...
4. **多线程**: - **GCD (Grand Central Dispatch)**:为了保证用户界面的流畅性,网络通信和复杂的计算任务应在后台线程进行,使用GCD可以方便地管理并发任务。 - **OperationQueue**:另外,还可以利用...
1. **线程安全**:确保在多线程环境下,对共享数据(如计时数据)的操作是线程安全的,可以使用`synchronized`关键字或者`Atomic`类。 2. **暂停与恢复**:秒表应提供暂停和恢复功能,这需要在线程管理和时间更新...
- **多线程编程**:介绍如何利用Grand Central Dispatch (GCD) 和NSOperationQueue等技术进行并发编程。 - **性能监控**:使用Instruments工具对应用进行性能分析,找出瓶颈并优化。 ##### 2. 安全性 - **数据加密*...
这可能意味着它会涵盖更高级的主题,如性能优化、多线程处理、游戏物理引擎、或者更复杂的游戏机制。 压缩包中的 "GameBoxDemo5.SDK3.0" 文件名揭示了这可能是一个名为"GameBox"的游戏框架或库的第五个演示版本,...
8. **性能优化**:由于iOS设备的硬件限制,游戏性能优化是必不可少的,包括内存管理、图形渲染优化、多线程编程等。 9. **游戏测试**:使用iOS模拟器和真机进行测试,确保游戏在不同设备和操作系统版本上的兼容性和...
- **多线程与后台任务**:教授如何实现多线程编程,处理后台任务,如下载、上传等,同时保持应用的响应性。 - **多媒体应用开发**:涵盖如何使用AVFoundation框架进行音频和视频的播放与录制,以及如何处理图像和...
9. **多线程与并发**:对于大规模推送场景,JavaPNS可能需要利用多线程或异步处理来并发处理多个推送任务,提高整体性能。 10. **日志记录**:为了便于调试和监控,JavaPNS提供了日志功能,可以记录推送过程中的...