ExecutorService 和 NSOperationQueue】的更多相关文章

ExecutorService,简化了Android中的并发处理,NSOperationQueue简化了iOS中的并发处理.它们都管理线程池,作用十分相近,下面简单说明一下. 1.ExecutorService基本知识如下 An Executor that provides methods to manage termination and methods that can produce a Future for tracking progress of one or more asynchr…
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之ExecutorService线程池 Android线程管理之ThreadPoolExecutor自定义线程池 Android线程管理之AsyncTask异步任务 Android线程管理之ThreadLocal理解及应用场景 为什么要引入线程池? 1.)new Thread()的缺点 每次new Thread…
目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API. 虽然 NSOperation 是基于 GCD 实现的, 但是并不意味着它是一个 GCD 的 “dumbed-down” 版本, 相反,我们可以用NSOperation 轻易的实现一些 GCD 要写大量代码的事情. 因此, NSOperationQueue 是被…
ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{} 2.建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool();或者int cpuNums = Runtime.getRuntime().availableProcessors();                //获取当前系统的CPU 数目E…
在使用java.util.concurrent下关于线程池一些类的时候,相信很多人和我一样,总是分不清submit()和execute()的区别,今天从源码方面分析总结一下. 通常,我们通过Executors这个工具类提供多种方法来创建适合不同场景的线程池,这里就不一一介绍了. 例如,创建可缓存线程池,Executors.newCachedThreadPool(),源码如下: public static ExecutorService newCachedThreadPool() { return…
1.ExecutorService private static ExecutorService exec = null; public static ExecutorService getExecutorServiceInstance(){ if(exec == null){ exec = Executors.newCachedThreadPool(); } return exec;} public void threadNoticeOrMessageOrShortMessage (Integ…
服务端接收一个请求,常常需要同时进行几个计算或者向其他服务发送请求,最后拼装结果返回上游.本文就来看下JDK提供几个并行处理方案,牵涉到ExcecutorService/CompletionService.要实现的场景是请求有超时限制,如果所有操作都计算完成,则全部拼装返回:否则只拼装部分完成的结果. 1.前提 //任务类,sleep一个时间代表这个计算需要的耗时,返回一个计算结果. public class MyTask implements Callable<Integer> { priv…
本篇文章主要介绍下多线程下NSOperation.NSBlockOperation.NSInvocationOperation.NSOperationQueue的使用,列举几个简单的例子. 默认情况下,NSOperation并不具备封装操作的能力,必须使用它的子类,使用NSOperation子类的方式有3种: 1> 自定义子类继承NSOperation,实现内部相应的方法 2> NSBlockOperation 3>NSInvocationOperation 这讲先介绍如何用NSOper…
//线程数量 int threadNum = lists.size(); //创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(threadNum); for (int i = 0; i < threadNum; i++) { final List<ChannelInfo> c = lists.get(i); final int currentThreadNum = i; pool.execute(new Runnab…
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解.[size=1.8em]Handler+Runnable模式 我们先看一个并不是异步线程加载的例子,使用 Handler+Runnable模式. 这里为何不是新开线程的原因请参看这篇文章:Android Runnable 运行在那个线程 这里的代码其实是在UI 主线程中下载图片的,而不是新开线程. 我们运行下面代码时,会发现他其实是阻塞了整个界面的…
1.设置最大并发数 什么是并发数 同时执行的任务数 比如,同时开3个线程执行3个任务,并发数就是3   最大并发数的相关方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 默认是并发队列,如果最大并发数>1,并发 如果最大并发数==1,串行队列 系统的默认是最大并发数-1 -(void)maxConcurrentOperationCount { //…
NSOperationQueue的作用 NSOperation可以调用start方法来执行任务,但默认是同步执行的 如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作 添加操作到NSOperationQueue中 - (void)addOperation:(NSOperation *)op; - (void)addOperationWithBlock:(void (^)(void))block; -(void)blo…
首先,我们要明确NSOperationQueue与GCD之间的关系: NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象. 其次,我们要区别两者的不同: GCD仅仅支持FIFO队列,而NSOperationQueue中的队列可以被重新设置优先级,从而实现不同操作的执行顺序调整. GCD不支持异步操作之间的依赖关系设置.如果某个操作的依赖另一个操作的数据(生产者-消费者模型是其中之一),使用NSOperationQueue能够按照正确的顺序执行操作.GCD则没有内建的依赖关系支…
一. GCD GCD中最重要的两个东西 任务 和 队列 任务就是一段代码(用来缓存,下载,计算等操作) 队列从大的方面分为两个队列:主队列(串行队列)和 自己创建的队列(串行,和并行) 主队列中: 在主队列中不能开启新的线程出来(所以同步和异步的效果是一样的,但是按钮会回弹上来,变成可以点击的样子,但是实际点击了也是无效的) 在主队列中,不能执行同步的方法,主线程的方法执行完,才会执行主线程方法里的主线程方法,这样就会两个任务互相等待! 而异步就可以把主任务暂时挂起,先执行完主线程的任务,然后在…
说到java开发,免不了跟多线程打交道.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动.执行和关闭,可以简化并发编程的操作.因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时…
在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中,可以很容易控制线程的启动.执行和关闭过程,还可以很容易使用线程池的特性.   一.创建任务   任务就是一个实现了Runnable接口的类. 创建的时候实run方法即可.   二.执行任务   通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对…
    #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; /*---------------------------NSOperation--------------------------------------*/     //创建线程队列(线程池)    …
注:本人是翻译过来,并且加上本人的一点见解. 要点: 1.前言 2.pthread 3.NSThread 4.Grand Central Dispatch(GCD) 5.Operation Queues 6. Run Loops 7. 多线程编程中面临的挑战 8. 资源共享 9. 互斥锁 10. 死锁 11. 资源饥饿(Starvation) 12. 优先级反转 13. GCD与Operation Queue对比 1. 前言 其实把RunLoop叫做多线程不正确,因为它不能真正的并行,不过因为它…
ExecutorService 通常Executor对象会创建并管理一组执行Runnable对象的线程,这组线程被称为线程池,Executor基于生产者-消费者模式.提交任务的执行者是生产者(产生待完成的工作单元),执行任务的线程是消费者(消耗掉这些工作单元) http://www.cnblogs.com/dennisit/p/3690378.html isShutdown isTerminated invokeAll invokeAny invoke execute shutdown summ…
while(true){ try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 像如上代码,使用ExecutorService对象调用shutdownNow方法或shutdown方法,线程都不会停止.要想停止线程需要改成如下代码: while (!Thread.interrupted()) { try { sleep(100…
在ThreadPoolExecutor中使用ExecutorService中的方法 方法invokeAny()和invokeAll()具有阻塞特性 方法invokeAny()取得第一个完成任务的结果值,当第一次任务执行完成后,会调用interrupt()方法将其他任务中断,所以在这些任务中可以结合if(Thread.currentThread().isInterrupted() == true)来决定任务是否继续运行. 无if(Thread.currentThread().isInterrupt…
1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装 2> GCD只支持FIFO(先入先出)的队列,NSOperationQueue可以很方便地调整执行顺序.设置最大并发数量 3> NSOperationQueue可以在轻松在Operation间设置依赖关系,而GCD需要写很多的代码才能实现 4> NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted).是否结束(isFinished),是否取…
一.简介 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的.也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的. 创建一个操作队列: NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 二.添加NSOperation到NSOperationQueue中 1.添加一个operation [queue addOperation:operat…
区别: Thread: 是这几种方式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间, 它们拥有对数据相同的访问权限.你得协调多个线程对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销.在 iOS 中我们可以使用多种形式的 thread. Cocoa threads(NSObject): 使用 NSThread 或直接从 NSObject 的类方法 performSelectorInBackgrou…
我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用. 之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象. 在主线程中遍历这个list并调用Future的get()方法取到Task的返回值. public class CompletionServiceTest { static class Task implemen…
package com.suning.ecif.admin.app.impl.temp; import java.util.ArrayList;import java.util.Collection;import java.util.concurrent.Callable;import java.util.concurrent.CompletionService;import java.util.concurrent.ExecutionException;import java.util.con…
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 05—— Callable和Future 并发编程 06—— CompletionService : Executor 和 BlockingQueue 并发编程 07—— 任务取消 并发编程 08—— 任务取消 之 中断…
翻译javadoc系列文章之:ExecutorService /** * An {@link Executor} that provides methods to manage termination and * methods that can produce a {@link Future} for tracking progress of * one or more asynchronous tasks. * * <p> An <tt>ExecutorService</…
private ExecutorService executorService = Executors.newFixedThreadPool(5); // 引入线程池来管理多线程 private void loadImage3(final String url, final int id) { executorService.submit(new Runnable() { public void run() { try { final Drawable drawable = Drawable.c…
转自由http://blog.csdn.net/totogo2010/ 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似.和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main.相当与ja…