iPhone操作队列 VS Java线程池

作者   孙东风  2011-1-12   转载请注明出处

  http://blog.csdn.net/dongfengsun/archive/2011/01/12/6130683.aspx

引言

在涉及多线程并发操作时,如何管理多线程对共享数据的访问以及防止线程间的死锁问题是个很重要的话题。在  Java   语言中,从  Java 5   开始, Java   提供了自己的线程池  ThreadPoolExecutor   类;在  iPhone   中则提供了  NSOperationQueue   类进行多线程的管理和调度。

 

什么是线程池?

线程池到底是怎么一回事呢?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的典型的执行流程如下:

首先,启动若干数量的线程,并让这些线程处于睡眠状态

其次,当客户端有新的请求时,线程池会唤醒某一个睡眠线程,让它来处理客户端的请求

最后,当请求处理完毕,线程又处于睡眠状态

 

Java   线程池

线程池可以由程序员自己来实现,但是从  Java 5   开始,  Java   语言自带了线程池的类  ThreadPoolExecutor   ,这个类提供了典型的线程池管理的接口,来研究  ThreadPoolExecutor   类的实现无疑更有借鉴意义。

ThreadPoolExcutor   类常用的构造方式为

 

ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler)

参数  corePoolSize   为线程池维护线程的最少数量

参数  maximumPoolSize   为线程池维护线程的最大数量

参数  keepAliveTime   为线程池维护线程所允许的空闲时间

参数  unit   为线程池维护线程所允许的空闲时间的单位

参数  workQueue   为线程池所使用的缓冲队列

参数  handler   为线程池对拒绝任务的处理句柄

 

一个任务可以通过  excute(Runnable)   方法被添加到线程池,任务就是一个实现了  Runnable   接口的对象,而线程池通过  Runnable   类型对象的  run()   方法来执行任务。

 

典型的用法如下:

首先,构造一个线程池

ThreadPoolExecutor threadPool =

new ThreadPoolExecutor(2,4,3,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(3),new ThreadPoolExecutor.DiscardOldestPolicy());

 

for(int i = 1;i <= 5;i++)

{

      try

{

      String task = “task@”+i;

      System.out.println(“put”+task);

      threadPool.execute(new ThreadPoolTask());

}

}

catch(Exception e)

{

      e.printStackTrace();

}

而线程池所要执行的任务对象需要实现  Runnable   接口,线程池执行任务对象时调用任务对象的  run()   方法,它的实现代码如下:

public class ThreadPoolTask implements Runnable{

ThreadPoolTask(){}

public void run(){

      System.out.println(“start execute”);

}

}

 

iPhone   操作队列

iPhone   本身也支持多线程开发,同样,  NSThread   类提供对多线程开发的支持时也面临多线程的共享数据管理和死锁问题,于是  iPhone   也提供了类似于  Java   线程池的解决方案:任务队列  NSOperationQueue   类。

 Java   语言的  Runnable   接口一样,  iPhone   提供了  NSOperation   接口进行任务对象的封装,而通过将任务对象加入到  NSOperationQueue   队列,  NSOperationQueue   队列会分配线程进行任务对象的执行,任务对象的执行通过  - (void)main   方法,下面是典型的任务对象和任务队列的实现:

@interface ThreadPoolTask:NSOperation

{

}

@end

 

@implementation ThreadPoolTask

- (void)main

{

   NSLog(@”start execute”);

}

@end

 Java   语言中一样,构造一个多线程池并添加任务对象到线程池中,线程池会调用任务对象的  - (void)main   方法执行任务,  iPhone   中典型的任务队列的实现如下:

 

NSOperationQueue* threadPool = [[NSOperation alloc] init];

[threadPool setMaxConcurrentOperationCount:4];

for(int i = 1;i <= 5;i++)

{        

NSString* task = [NSString stringWithFormat:@”task %d”,i];

NSLog(@“put %@”,task);

[threadPool add:([[ThreadPoolTask alloc] init])];

}

可以看到,  iPhone   通过  NSOperationQueue   提供了一套类似于线程池的机制,通过它可以更加方便的进行多线程的并发操作,从而使得程序员从繁杂的多线程共享数据管理和死锁问题中解脱出来。

你可能感兴趣的:(apple,cocoa,Objective-C)