《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 利用iphone的多線程實現“售票系統”
利用iphone的多線程實現“售票系統”
摘要: 在這篇文章中,筆者就拿大多數Java教程中經典的“售票系統多線程”作為實際例子,在iphone中進行同樣的實現。
Abstract:
Key words :

  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

  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版本的“售票系統多線程”程序是否跑起來了:)。

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 九九午夜视频 | 免费麻豆视频 | 亚洲精品中文字幕 | 女体拷问一区二区三区 | 乱码一区二区三区 | 成人免费毛片网 | 黄色国产小视频 | 狠狠干女人 | 中文字日产幕码三区的做法大全 | 在线免费观看av片 | 男人爱看的网站 | a天堂最新版中文在线地址 a天堂最新地址 | 99ri国产| 少妇高潮一区二区三区 | www,久久久| 97在线看免费观看视频在线观看 | 真人毛片一24 | bb日韩美女预防毛片视频 | 性久久久久久久久 | 老司机精品久久 | 成人午夜高潮a∨猛片 | 与鸭共舞在线 | 天天摸天天做天天爽婷婷 | 国产性自拍 | 色就是色欧美 | 美女视频黄a视频免费全程软件axs | 国产美女在线精品免费观看 | 中文不卡视频 | a级一片 | tianlula成人精品 | 91视频免费看片 | 欧美大片xxx| 成人免费福利视频 | 亚洲第一页在线观看 | 人妻丰满熟妇av无码区hd | 2021中文字幕| 欧美日韩精品一区二区在线视频 | 国产大片黄在线观看私人影院 | 亚州国产 | 精品欧美h无遮挡在线看中文 | 亚洲成av人片天堂网无码】 | 91精品在线免费 | 白俄罗斯毛片 | 亚洲欧洲一区二区三区四区 | 亚洲自拍网站 | 色丁香久久 | 免费看特级毛片 | 毛片毛片毛片毛片毛片毛片 | 在线看亚洲十八禁网站 | 国产区在线 | 国产精品一区在线观看你懂的 | 亚洲国产精品久久青草无码 | 成人快色| 国产成人一区二区三区 | 久久精品伊人 | 欧美精品v国产精品v日韩精品 | 亚洲精品国产一区二区 | 国产午夜手机精彩视频 | 羞羞影院午夜男女爽爽 | 伊人久久大香网 | 在线播放的av | 亚洲精品久久久久久久久 | 成人网色 | 精品少妇ay一区二区三区 | 日屁视频| 黄瓜视频91 | 亚洲精品永久www嫩草 | 国产欧洲精品亚洲午夜拍精品 | 黄色小视频免费 | www.色网站| 91色影院| 亚洲综合婷婷 | 噜噜在线视频 | 欧美高清hd | 国产女人精品 | 91精品国自产在线偷拍蜜桃 | 亚洲精品国产av成拍色拍 | 波多野结衣人妻 | 久久久久久久久久久影院 | 鲁丝片一区二区三区 | 天堂网www在线资源中文 | 亚洲狠狠爱一区二区三区 | 黄色小视频链接 | xxx国产精品午xxx | 一区二区中文字幕在线 | 精品露脸国产偷人在视频 | 一区二区亚洲 | 欧美男女激情 | 色在线播放 | 免费激情网址 | 欧美精品videos | av中文在线天堂 | 一本久道久久综合狠狠爱 | 无码av中文字幕免费放 | 在线观看成人动漫 | 92电影网午夜福利 | 少妇口述偷人好爽的一次 | 国产欧美精品一区 | 亚洲国产综合精品久久久久久 | 久久综合久久美利坚合众国 | 色综合视频一区二区三区 | 粉嫩绯色av一区二区在线观看 | eeuss鲁片一区二区三区69 | 天天撸日日夜夜 | 国产女主播在线观看 | 香蕉视频一区二区 | 韩国黄色av | 免费欧美黄 | 久久人人爽爽人人爽人人片av | 国产伦精品一区二区三区视频不卡 | 国产精品入口免费视 | 在线看91| 国产91在线播放九色 | 亚洲国语 | 国产99久久久久久免费看农村 | h视频在线免费观看 | www精品在线| 国产青草 | 一级中文字幕 | 香港三级日本三级妇三级 | 动漫人妻h无码中文字幕 | 一级黄色视屏 | 国产国语熟妇视频在线观看 | 久久综合久久鬼色 | 国产精品自拍在线 | 欧美视频中文在线看 | bb日韩美女预防毛片视频 | 亚洲免费成人 | 午夜肉体高潮免费毛片 | 97色在线观看免费视频 | 丁香六月久久 | 国产丰满麻豆videossexhd 国产丰满农村老妇女乱 | 天躁夜夜躁2021aa91 | 91精品国产色综合久久不卡98口 | 亚洲国产成人综合 | 成人免费xxxxx在线视频 | 国产精品入口香蕉 | 成人免费无码av | 8x拔播拔播x8国产精品 | 久久久久国色av免费看 | 每日av更新 | 免费国产成人 | 成人免费精品视频 | 4438五月天| 色婷婷六月天 | 午夜伦理一区 | 粉嫩av亚洲一区二区图片 | 熟妇激情内射com | 无码丰满少妇2在线观看 | 午夜激情网站 | 国产精品久久久久一区二区国产 | 国产女同无遮挡互慰高潮91 | 中文天堂av| 国产成人精品优优av | 国产午夜手机精彩视频 | 国产露脸精品国产探 | 欧美怡春院 | 欧美日韩亚洲国产精品 | 色偷偷网站视频 | 亚洲天堂久久新 | 性高潮免费视频 | 国产92视频| 黑人ⅴvideo粗暴亚洲娇小 | 日本三级欧美三级人妇视频黑白配 | 91精品久久久久含羞草 | 国产馆视频| av不卡一区二区三区 | 18禁毛片无遮挡嫩草视频 | www.99爱| 久久婷婷五月国产色综合 | 精品国产96亚洲一区二区三区 | 亚洲激情一区 | 女人与黑人做爰啪啪 | 国产粉嫩呻吟一区二区三区 | 久久久久久久久久久久久久久 | 国产高清999| 亚洲欭美日韩颜射在线二 | 日日综合网| 国产免费成人 | 国产一级大片在线观看 | 中文字幕日韩精品无码内射 | 国产精品大尺度 | 国内精品免费午夜又爽又色愉情 | 国产一精品一av一免费爽爽 | 天堂中文av | 岛国二区三区 | 国产一区二区三区在线电影 | 中文字幕――色哟哟 | 天天色影网 | 五月婷婷狠狠爱 | 欧美性videos高清精品 | 国产在线伊人 | 欧美国产一级片 | 亚洲精品网站日本xxxxxxx | 奶大臀圆magnet少妇 | 用力使劲高潮了888av | 人妻聚色窝窝人体www一区 | 一边捏奶头一边高潮视频 | 久久九九精品国产综合喷水 | 丁香在线 | 亚洲中文字幕无码久久 | 狠狠躁天天躁夜夜添人人 | 日日摸日日碰夜夜爽久久四季 | 久久噜噜少妇网站 | 国产精品igao视频 | 日本va欧美va欧美va精品 | 第一福利在线视频 | 天堂av2021| 91九色丨porny最新地址 | 欧美一级大黄大黄大色毛片小说 | 日韩精品一区二区中文字幕 | 久久国产精品综合 | 日本三级少妇 | 国产高清视频在线观看97 | 久久久国产一区二区三区四区小说 | 亚洲自拍偷拍综合 | 欧美性一级 | 亚洲一区二区三区视频在线 | 在线观看黄色小视频 | 久久一区亚洲 | 中国精品久久 | 麻豆亚洲 | 亚洲涩涩网 | 久久久久久人妻一区二区三区 | 麻豆视频一区二区 | 寡妇疯狂性猛交 | 99国产视频 | 一级片在线 | 无码国产精品一区二区免费16 | 91av视频在线播放 | 中文字幕日日 | 精品人妻无码一区二区色欲产成人 | 视频一区二区在线 | 婷婷无套内射影院 | 欧美黑丝少妇 | 欧美日韩精品人妻狠狠躁免费视频 | 国产美女黄网站 | 国产日韩在线观看一区 | 日本一区二区免费在线观看 | 国产自偷自拍 | 久久视频这里有久久精品视频11 | 亚洲另类在线观看 | 午夜小视频在线观看 | 爱情岛成人www亚洲网站 | 久久不见久久见免费影院www日本 | 日本不卡影院 | 成人h动漫精品一区二区 | www.av成人| 久久99久久99精品免观看 | 亚洲性无码av中文字幕 | 欧美在线成人免费 | 日本激烈吮乳吸乳视频 | 日本三级吃奶乳视频在线播放 | 日韩在线永久免费播放 | 久久久精 | 日本无遮羞教调屁股视频网站 | 久久久精品一区 | 欧美成人精精品一区二区频 | 午夜精品久久久久久久99黑人 | 日韩精品一区二 | 在线观看黄网站 | 天海翼一区二区三区 | 91免费高清| 国产公开免费人成视频 | 在线观看av不卡 | 亚洲日本精品视频 | 激情小说图片视频 | 国产高清片| 亚洲午夜精品毛片成人播放器 | 国产寡妇亲子伦一区二区三区四区 | 人人鲁人人莫一区二区三区 | 激情丁香 | 国产成人综合欧美精品久久 | 国产日韩欧美综合在线 | 天天躁日日躁狠狠躁喷水软件 | 性网爆门事件集合av | 特黄特色免费视频 | 色无极影院亚洲 | 大桥未久av一区二区三区中文 | 免费看污片的网站 | 午夜性刺激免费看视频 | 亲子伦一区二区三区观看方式 | 草逼网站 | 91免费高清视频 | 国产妞干网 | 亚洲精品一区二区在线 | 日韩精品一区二区三区亚洲综合 | 天堂av网站| 成人免费观看在线视频 | www.色网站| 久久精品无码一区二区小草 | h视频在线免费看 | 青青青国产精品一区二区 | 欧美亚洲视频 | 久久先锋男人av资源网站 | 中文字幕乱码一区av久久不卡 | 亚洲久草视频 | 美日韩一区二区三区 | 国产www精品| 夜夜嗨av一区二区三区 | 久草资源福利 | 免费国产a级片 | 91在线高清视频 | 亚洲欧美精品综合在线观看 | 久久99精品久久久久久无毒不卡8 | 国产色诱视频 | 美利坚合众国av | 91大神精品在线 | 国产免费久久精品国产传媒 | 亚洲黄色网络 | 日韩av三区| 一级做a爰片久久毛片潮喷 一级做a爰片欧美激情床 | 狠狠色噜噜狠狠狠狠色综合网 | 久草一级片| 97国产大学生情侣白嫩酒店 | 狂野欧美性猛交bbbb | 毛片毛片毛片毛片 | 欧美性在线观看 | 在线观看日批视频 | 亚洲精品国产suv一区88 | 91麻豆欧美成人精品 | 成人午夜一区 | 国产麻豆精品精东影业av网站 | 天天做天天爱天天爽综合网 | 精品久久久无码中文字幕 | 国产精品久久久久久久不卡 | 最近更新中文字幕第一页 | 国产特级av| 久久久国产精品人人片 | 婷婷亚洲一区 | 久久久久一| 99久久99九九99九九九 | 91精品国自产在线偷拍蜜桃 | 四虎国产精品成人免费4hu | 午夜影视av| 精品中出| 婷婷日韩 | 久久久久国产一区二区 | 日本高清无卡码一区二区久久 | 激情综合色综合啪啪五月丁香 | 国产伦子沙发午休系列资源曝光 | 精品一区二区三区免费播放 | 免费观看性生交大片女神 | 日产精品一区二区三区在线观看 | 精精国产xxxx视频在线观看 | 韩国午夜av | 中文无码精品a∨在线观看不卡 | 国产成人麻豆精品午夜福利在线 | 久久久极品 | 动漫精品专区一区二区三区 | 日韩精品免费 | 一本大道卡一卡二卡三乱码全集资源 | 久久精品99久久香蕉国产色戒 | 亚洲啪啪网址 | 国产一区二区三区成人欧美日韩在线观看 | 内射人妻少妇无码一本一道 | 久久久人成影片免费观看 | 精品一区二区三区在线播放 | 亚洲国产精品日韩av不卡在线 | chinesehd一区二区三区 | 黑白配在线观看免费观看 | 国产精品成人3p一区二区三区 | 毛片a久久99亚洲欧美毛片 | 欧美人与物videos另类xxxxx | 国产亚洲精品久久777777 | 久久久亚洲裙底偷窥综合 | 三级免费看| 最新中文字幕av无码不卡 | 狠狠色噜噜狠狠狠狠97首创麻豆 | 三上悠亚人妻中文字幕在线 | 欧美午夜性春猛交 | 亚洲三级免费观看 | 99热在线观看免费 | 九九九热| xx中文字幕乱偷avxx | 亚洲一区二区三区含羞草 | 新婚夫妇白天啪啪自拍 | 她也啪在线视频 | 成人做爰100部片免费下载 | 日韩性欧美 | 我要看免费黄色片 | 少妇高潮大叫好爽 | 超碰在线人人 | 亚洲一区二区三区影院 | 亚洲国产精品无码久久一区二区 | 亚洲精品久久久久久下一站 | 欧美午夜精品久久久久久浪潮 | 91丨porny丨九色 | 国产露出视频 | 国产裸体永久免费视频网站 | 欧美色炮| 99国产精品一区二区 | 国产69精品久久99卡顿的解决方法 | 亚洲春色av无码专区在线播放 | 18禁美女裸体无遮挡网站 | 国产91欧美 | 中文字幕丝袜诱惑 | 一级性生活免费视频 | 一区二区三区欧美在线观看 | 亚洲免费砖区 | 亚洲天堂国产 | 国产精品成人一区二区艾草 | 亚洲高清在线看 | 天天躁夜夜躁很很躁麻豆 | 久久成年视频 | 无码手机线免费观看 | 国产超碰人人模人人爽人人添 | 亚洲黄色免费在线观看 | 霍思燕三级| 日产亚洲一区二区三区 | 在线亚洲一区二区 | 精品一区二区亚洲 | 日本亚洲欧美在线 | 黄色一级大片在线免费看产 | 一道本久久 | 成人毛片网站 | 色综合久久精品亚洲国产 | 国产精品久久久免费视频 | 国产精品爱久久久久久久 | 人妖性生活视频 | 夜夜爽日日澡人人添 | 日日噜噜噜夜夜爽爽狠狠同性男 | 国产欧美一区二区精品婷婷 | 超碰狠狠操 | 国产最新在线 | 中文字幕国产 | 黄色大片在线 | 日本大胆欧美人术艺术 | 国产三级在线 | 中文在线a√在线8 | 在线免费看黄网站 | 国产日本一区二区 | 午夜寡妇啪啪少妇啪啪 | 香蕉视频| av片免费观看 | 久久久www成人免费毛片 | 中文字幕二十三页2 | 天天干天天干天天干天天 | 久久久国产精品视频 | 亚洲精品国产suv一区 | 久久丁香五月天综合网 | 欧美人与动物xxxxz0oz | 日韩av在线网 | 男人添女人下部高潮全视频 | 国产女同玩人妖 | 12一15性xxxx粉嫩国产 | 女朋友闺蜜奶好大下面好紧视频 | 婷婷丁香六月激情综合啪 | 亚洲精品久久一区二区三区 | 久久天天躁狠狠躁夜夜躁2014 | 一本精品999爽爽久久久 | 性一交一乱一色一视频 | 国产久热精品无码激情 | 国内精品久久久久久久97牛牛 | 青青草视频在线观看免费 | 免费黄色欧美 | 愉拍自拍第43页免费 | 日韩精品一区二区三区亚洲综合 | av一片| 日本精品视频一区二区 | 91pornyⅰ九色| 第一页国产 | 日日夜精品 | 刘亦菲三级床视频大全 | 无遮挡呻吟娇喘视频免费播放 | 少妇淫片aaaaa毛片叫床爽 | 亚洲一区观看 | 久久黄色小视频 | 亚洲成a人片在线观看无码专区 | 日本人与禽zozzo小小的几孑 | 91av国产精品 | 亚洲免费资源 | 四虎在线视频 | 欧美午夜理伦三级在线观看吃奶汁 | а√中文在线资源库 | 免费看黄色一级视频 | 成年人网站在线 | 欧美黑人狂野猛交老妇 | 亚洲大片免费 | 色婷婷一区二区三区四区 | 亚洲免费黄色 | 北京富婆泄欲对白 | 性欧美老妇另类xxxx | 在线看不卡av | 天天干人人 | 欧美一区1区三区3区公司 | 婷婷伊人五月色噜噜精品一区 | 亚洲xxxxxx| 久久zyz资源站无码中文动漫 | 成人性生交大片免费看r老牛网站 | 人善交另类亚洲重口另类 | 男人天堂2024| 扒开双腿疯狂进出爽爽爽 | 亚洲女人天堂成人av在线 | 久久国产成人精品av | 国产日韩欧美一区二区宅男 | 成人拍拍 | 一区二区三区日韩在线 | 天天操天天看 | 免费的a级毛片 | www.在线视频 | 国产香蕉尹人视频在线 | 国产午夜成人免费看片 | 国产成人一区二区三区视频 | 看全色黄大色大片免费 | 99久久免费精品 | 精品播放| 国产v亚洲v天堂无码 | 男女啪啪做爰高潮无遮挡 | 成人免费视频网站在线观看 | 亚洲精品日本 | 国产成人精品视频 | 国产suv精品一区二区883 | 国产山村乱淫老妇女视频 | 一区二区三区四区五区视频 | 人人妻人人玩人人澡人人爽 | 亚洲免费色视频 | av黄色成人| 国内精品视频在线观看 | 欧美一区二区三区四区五区六区 | 亚洲毛片av日韩av无码 | 国产午夜福利亚洲第一 | 久久久国产一区二区三区 | 中字幕人妻一区二区三区 | 国产免费一区二区三区免费视频 | 狼人无码精华av午夜精品 | 亚洲性视频网站 | 欧美精品一区二区蜜臀亚洲 | 久久男人av久久久久久男 | 四季av中文字幕 | 成人在线观看你懂的 | 丁香六月综合 | 日韩精品欧美 | 暖暖日本视频 | 国产爽爽久久影院潘金莲 | 国产精品久久久久久久免费看 | 日本少妇高潮喷水视频 | 免费观看一区二区三区 | 欧美成人不卡视频 | 欧美性xxxxx极品少妇 | 日韩女同互慰一区二区 | 国产二区自拍 | 亚洲精品中文字幕乱码三区 | 国产精品永久久久久 | 青青草手机视频 | 国产av人人夜夜澡人人爽麻豆 | 日本黄色三级视频 | 国产自国产自愉自愉免费24区 | 僵尸叔叔在线观看国语高清免费观看 | 欧美视频黄 | 91亚洲一线产区二线产区 | 屁屁国产草草影院ccyycom | 私色综合网| 美女诱惑av | 少妇毛片一区二区三区免费视频 | 四虎影视在线永久免费观看 | 亚洲视频四区 | 无码国内精品人妻少妇蜜桃视频 | 午夜黄色福利视频 | 免费伊人| 天天插天天射天天干 | 69视频免费在线观看 | 亚洲成人黄 | 欧美在线专区 | 欧美野外疯狂做受xxxx高潮 | 91精品国产91久久久久游泳池 | 亚洲jizzjizz日本少妇软件 | 成年人在线观看av | 丁香六月欧美 | 日本人做爰全过程 | 成人性生交大片免费看r视频 | 肉色超薄丝袜脚交一区二区 | 国产精品亚洲综合色区韩国 | 一级片成人 | 亚洲日日射 | 国产91精品看黄网站在线观看动漫 | 亚洲精品热 | 欧美亚洲色综久久精品国产 | 免费在线国产 | 男人天堂aaa | 色婷婷综合久久久久中文一区二区 | 国产精选在线观看 | 黑人性较视频免费视频 | 国产视频一区二区三区四区五区 | 国产极品91 | 日本网站免费 | 欧美a级在线免费观看 | 少妇无套内谢久久久久 | 国产香蕉精品 | 夜夜操夜夜爱 | 欧美 日韩 国产 成人 在线 | 99国产精品入口 | 亚洲视屏在线 | 国产精品丝袜黑色高跟 | 天天干天天干天天操 | 国产女人爽的流水毛片 | 插插射啊爱视频日a级 | 国内自拍农村少妇在线观看 | 成人国产精品免费观看视频 | 色婷婷精品 | 在线看欧美| 无码粉嫩虎白一线天在线观看 | av色综合久久天堂av色综合在 | 男人的天堂2018无码 | 日本公妇乱淫xxxⅹ 日本公妇乱淫免费 | 欧美激情一区二区久久久 | 日韩欧美网址 | 在线观看国产精品普通话对白精品 | 日韩视频中文字幕 | 欧美激情校园春色 | 久草福利在线观看 | 中文字幕第十二页 | 久久久久无码精品国产 | 天天干夜夜干 | 狠狠一区二区 |