当前位置:首页>管理咨询>iPhone操作队列 VS Java线程池 查询:
     
iPhone操作队列 VS Java线程池

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

引言

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

什么是线程池?

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

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

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

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

Java线程池

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

ThreadPoolExcutor类常用的构造方式为

ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueRunnableworkQueue,RejectedExecutionHandlerhandler)

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

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

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

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

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

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

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

典型的用法如下:

首先,构造一个线程池

ThreadPoolExecutorthreadPool=

newThreadPoolExecutor(2,4,3,TimeUnit.SECONDS,newArrayBlockingQueueRunnable(3),newThreadPoolExecutor.DiscardOldestPolicy());

for(inti=1;i=5;i++)

{

try

{

Stringtask=“task@”+i;

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

threadPool.execute(newThreadPoolTask());

}

}

catch(Exceptione)

{

e.printStackTrace();

}

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

publicclassThreadPoolTaskimplementsRunnable{

ThreadPoolTask(){}

publicvoidrun(){

System.out.println(“startexecute”);

}

}

iPhone操作队列

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

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

@interfaceThreadPoolTask:NSOperation

{

}

@end

@implementationThreadPoolTask

-(void)main

{

NSLog(@”startexecute”);

}

@end

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

NSOperationQueue*threadPool=[[NSOperationalloc]init];

[threadPoolsetMaxConcurrentOperationCount:4];

for(inti=1;i=5;i++)

{

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

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

[threadPooladd:([[ThreadPoolTaskalloc]init])];

}

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


河道水毁修复工程施工方案(堤防)项目经理,项目的灵魂
《合同法》总则的主要内容:合同终止让管理者对“管理坏行为”说“再见”
建筑工程模板工程施工方案(33页)梁、柱接头节点平面及剖面图
南水北调渠道混凝土衬砌施工技术方案如保学好JavaScript?初学者应注意的七个细节
浙江龙泉全力打造城市森林“城市越绿,生活越幸福”雨水管、变形缝制作安装技术交底
硬盘引导型故障分析及排除2015年二级建造师考试《公路工程》模拟题22
浅析建设项目招投标阶段造价的控制实用的端口大全(中文版)
建筑风水 大自然与人文环境的完美结合建设工程施工合同的条件
信息发布:广州名易软件有限公司 http://www.myidp.net
  • 名易软件销售服务
  • 名易软件销售服务
  • 名易软件技术服务

  • iPhone操作队列 VS Java线程池,iPhone操作队列 VS Java线程池