配色: 字号:
深入java线程池的使用详解
2016-10-11 | 阅:  转:  |  分享 
  
深入java线程池的使用详解

本篇文章是对java线程池的使用进行了详细的分析介绍,需要的朋友参考下

在Java5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor,ExecutorService、ScheduledExecutorService,让我们先用一个图来显示它们的关系:

图的左侧是接口,图的右侧是这些接口的具体类。注意Executor是没有直接具体实现的。Executor接口:是用来执行Runnable任务的,它只定义一个方法:?execute(Runnablecommand):执行Ruannable类型的任务ExecutorService接口:ExecutorService继承了Executor的方法,并提供了执行Callable任务和中止任务执行的服务,其定义的方法主要有:?submit(task):可用来提交Callable或Runnable任务,并返回代表此任务的Future对象?invokeAll(collectionoftasks):批处理任务集合,并返回一个代表这些任务的Future对象集合?shutdown():在完成已提交的任务后关闭服务,不再接受新任务?shutdownNow():停止所有正在执行的任务并关闭服务。?isTerminated():测试是否所有任务都执行完毕了。?isShutdown():测试是否该ExecutorService已被关闭ScheduledExecutorService接口在ExecutorService的基础上,ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:?schedule(task,initDelay):安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。?scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行?scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。重要的Executors类虽然以上提到的接口有其实现的具体类,但为了方便Java5.0建议使用Executors的工具类来得到Executor接口的具体对象,需要注意的是Executors是一个类,不是Executor的复数形式。Executors提供了以下一些static的方法:?callable(Runnabletask):将Runnable的任务转化成Callable的任务?newSingleThreadExecutor:产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。?newCachedThreadPool():产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。?newFixedThreadPool(intpoolSize):产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个queue里顺序执行。?newSingleThreadScheduledExecutor:产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行。?newScheduledThreadPool(intpoolSize):产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个queue里等待执行举例说明:应用Executors来建立Threadpool有时候您需要建立一堆Thread来执行一些小任务,然而频繁的建立Thread有时会是个开销,因为Thread的建立必须与作业系统互动,如果能建立一个Threadpool来管理这些小的Thread并加以重复使用,对于系统效能会是个改善的方式。您可以使用Executors来建立Threadpool,Executors有几个static方法,列出如下:

方法 说明 建立可以快取的Thread,每个Thread预设可idle60秒 包括固定数量的Thread 只有一个Thread,循序的执行指定给它的每个任务 可排程的Thread 单一可排程的Thread



















献花(0)
+1
(本文系白狐一梦首藏)