当前位置:首页>> iPhone操作队列 VS Java线程池

iPhone操作队列 VS Java线程池

发布时间:2016-03-18作者:智汇小新

  引言

  在涉及多线程并发操作时,如何管理多线程对共享数据的访问以及防止线程间的死锁问题是个很重要的话题。在 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 提供了一套类似于线程池的机制,通过它可以更加方便的进行多线程的并发操作,从而使得程序员从繁杂的多线程共享数据管理和死锁问题中解脱出来。

公司简介

宜科(天津)电子有限公司是中国工业自动化的领军企业,于2003年在天津投资成立,销售和服务网络覆盖全国。作为中国本土工业自动化产品的提供商和智能制造解决方案的供应商,宜科在汽车、汽车零部件、工程机械、机器人、食品制药、印刷包装、纺织机械、物流设备、电子制造等诸多领域占据领先地位。宜科为智慧工厂的整体规划实施提供自系统层、控制层、网络层到执行层自上而下的全系列服务,产品及解决方案涵盖但不局限于云平台、MES制造执行系统、工业现场总线、工业以太网、工业无线通讯、机器人及智能设备组成的自动化生产线、自动化电气控制系统集成、智能物流仓储系统等,以实现真正智能化的生产制造,从而带来生产力和生产效率的大幅提升,以及对生产灵活性和生产复杂性的管理能力的大幅提升。多年来,宜科以创新的技术、卓越的解决方案和产品坚持不懈地为中国制造业的发展提供全面支持,并以出众的品质和令人信赖的可靠性、领先的技术成就、不懈的创新追求,在业界独树一帜。帮助中国制造业转型升级,加速智能制造进程,成为中国工业4.0智慧工厂解决方案当之无愧的践行者。

更多详情>>

联系我们

  • 联系人:章清涛
  • 热线:18611695135
  • 电话:
  • 传真:
  • 邮箱:18210150532@139.com

Copyright © 2015 ilinki.net Inc. All rights reserved. 智汇工业版权所有

电话:010-62314658 邮箱:service@ilinki.net

主办单位:智汇万联(北京)信息技术有限公司

京ICP备15030148号-1