iPhone操作队列 VS Java线程池
作者 孙东风 2011-1-12 转载请注明出处
引言
在涉及多线程并发操作时,如何管理多线程对共享数据的访问以及防止线程间的死锁问题是个很重要的话题。在 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 提供了一套类似于线程池的机制,通过它可以更加方便的进行多线程的并发操作,从而使得程序员从繁杂的多线程共享数据管理和死锁问题中解脱出来。
- 1全国DNS地址大全,全国各地DNS
- 2数据库中死锁的产生原因和避免
- 3怎样隐藏共享资源
- 4敏捷测试的方法和实践
- 5什么是软件版本标志
- 6操作系统与系统配置
- 7电脑显示器的相关设置与常见故障排除方法
- 8开机BIOS语言
- 9实用的端口大全(中文版)
- 10解决限制使用应用程序问题
- 11百度笔试题:malloc/free与new/delete的区别
- 12C++为什么难学
- 13更改IE的默认搜索引擎
- 14如何使用系统还原
- 15RUNDLL32.EXE 是什么程序
- 16解决QQ和360软件共存的办法--无聊的战争
- 17调整调出输入法的顺序
- 18双击无法打开文件夹
- 19iPhone操作队列 VS Java线程池
- 20命令设计模式
- 21WinXP瘦身办法
- 22windows下的EXE文件大揭密
- 23双系统安装方法
- 24更改屏幕保护程序关联方式
- 25电脑/计算机/Windows2000/XP启动过程详解
- 26禁止WinXP文件夹自动展开
- 27解决开机ESCD错误
- 28如何知道局域网中所有计算机的IP地址
- 29设置虚拟内存
- 30解决显示器花屏问题
成都公司:成都市成华区建设南路160号1层9号
重庆公司:重庆市江北区红旗河沟华创商务大厦18楼