赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android系统的并发编程
Android系统的并发编程

Android应用程序支持多线程。线程池即开辟一块内存空间,里面存放了众多创建启动好但处于睡眠状态的线程,其中的线程调度由池管理器来处理。当有线程任务时,从池中取出一个,执行完成后归池,这样可以避免反复创建线程对象所带来的开销,节省系统资源。可以根据系统环境情况,自动或手动设置线程数量,以达到最佳效果。
软件包java.util.concurrent包含了并发编程中常用的实用工具类,其中Executor是一个简单的标准化接口,用于定义类似于线程的自定义系统,包括线程池、异步IO、轻量级任务框架。根据使用的Executor类的不同,可能在新创建的线程中、现有的任务执行线程中或调用execute()的线程中执行任务,并且可能顺序或并发执行。ExecutorService提供了多个完整的异步任务执行框架,用于管理任务的排队和安排,并允许受控制的关闭。ScheduledExecutor Service子接口及相关的接口添加了对延迟的和定期任务执行的支持。ExecutorService提供了安排异步执行的方法,可执行由Callable表示的任何函数,结果类似于Runnable。Future模式能够返回函数的结果,允许确定执行是否完成,并提供取消执行的方法。RunnableFuture是拥有run方法的Future,run方法执行时将设置其结果。
ThreadPoolExecutor和ScheduledThreadPoolExecutor提供了可调的、灵活的线程池,Executor类提供了大多数Executor的常见类型和配置方法,以及使用它们的实用工具方法。其他基于Executor的实用工具包括具体类FutureTask,它提供了Future的常见可扩展实现,以及ExecutorCompletionService,有助于协调对异步任务组的处理。

1.Executor:

Java里线程池的顶级接口是Executor,其实只是一个执行线程的工具,用来执行已提交的Runnable任务的对象。通常使用Executor,而不是显式地创建线程。如:
Executor executor=anExecutor;
executor.execute(new RunnableTack1());
executor.execute(new RunnableTack2());
......
不过,Executor接口并没有严格地要求执行是异步的。在最简情况下,执行程序可以在调用者的线程中立即运行已提交的任务:
class DirectExecutor implements Executor{
public void execute(Runnable r){
r.run();
}
}
更常见的是,任务是在某个不是调用者线程的线程中执行的。
class ThreadPerTaskExecutor implements Executor{
public void execute(Runnable r){
new Thread(r).start();
}
}

2.ExecutorService:

ExecutorService继承了Executor,是真正的线程池接口,其提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future的方法。
可以关闭ExecutorService,这将导致其拒绝新任务,有shutdown()和shutdownNow()方法。shutdown()方法在终止前允许执行以前提交的任务,而shutdownNow()方法阻止等待任务的启动并试图停止当前正在执行的任务。在终止后,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的ExecutorService以允许回收其资源。
Executor类为创建ExecutorService提供了便捷的方法。newCachedThreadPool创建一个可缓存的线程池,如果线程池大小超过了处理任务所需要的线程就会回收部分空闲的线程,当任务增加时又可以智能添加新线程来处理,不会对线程大小设限,其大小完全依赖于操作系统能够创建的最大线程大小。newFixedThreadPool创建固定大小的线程池,每次提交任务就创建一个线程,直到线程达到线程池的最大容量。newSingleThreadExecutor创建一个单线程池,线程池中只有一个线程在工作,保证了所有任务的执行顺序按照任务的提交顺序执行。newScheduledThreadPool创建一个定长线程池,支持定时以及周期性执行任务的需求。

3.ThreadPoolExecutor:

ThreadPoolExecutor是ExecutorService的一个实现类,它使用可能的几个线程之一执行每个提交的任务,通常使用Executor工厂方法配置。ThreadPoolExecutor的构造方法为:
·ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue)
·ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue,RejectedExecutionHandler handler)
·ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue,ThreadFactory threadFactory)
·ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
其中,corePoolSize为线程池中保存的线程数,包括空闲线程;maximumPoolSize为池中允许的最大线程数;keepAliveTime表示当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间;unit为keepAliveTime参数的时间单位;workQueue为执行前用于保持任务的队列,此队列仅保持由execute方法提交的Runnable任务;threadFactory为执行程序创建新线程时使用的工厂;handler为由于超出线程范围和队列容量而使执行被阻塞时所执行的处理程序。
所有的BlockingQueue都可以用于传输和保持提交的任务,如果运行的线程少于corePoolSize,则Executor始终首选添加新线程,而不进行排队;如果运行线程等于或多于corePoolSize,则Executor始终首选将请求加入队列,而不添加新线程;如果无法将请求加入队列,则创建新线程,除非创建此线程超出maximumPoolSize,在这种情况下任务将被拒绝。

4.Future模式:

Futrue模型是将异步请求和代理模式联合的模型,当客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据,用户也无须等待,先去执行其他的若干操作,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659