Java.util.concurrent之 Executor框架与线程池 怼烎@ 2022-06-16 04:49 122阅读 0赞 Executor框架是java 5 中引入的,内部使用了线程池机制。Executor框架包括:Executor, ExecutorService,Executors,ThreadPoolExecutor等。 ## Executor ——接口 ## public interface Executor { void execute (Runnable command); } Executor接口中定义一个方法execute(Runnable command),该方法接收一个Runnable实例,它用来执行一个任务,任务即是一个实现了Runnable接口的类。 ## ExecutorService——接口 ## public interface ExecutorService extends Executor { void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throw InterruptedException; //...其他用于提交的便利方法 } ExecutorService继承了Executor的接口,同时提供了更丰富的生命周期管理的方法。ExecutorService的生命周期有3种状态:运行、关闭和已停止。 shutdown方法将执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成——包括哪些还未开始执行的任务。 shutdownNow方法将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。 ## Executors提供工厂方法用于创建线程池 ## * newFixedThreadPool:将创建固定长度的线程池,每提交一个任务就创建一个线程,直到达到线程池的最大数量。(如果某个线程由于发生了未预期的Exception而结束,那么线程池会补充一个新的线程)。 * newCachedThreadPool:创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程,线程池的规模不存在任何限制。 * newSingleThreadPool:是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建另一个线程来替代。newSingleTreadPool能确保依照任务在队列中的顺序来串行执行(例如FIFO、LIFO、优先级) * newScheduledThreadPool:创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务。 ## ThreadPoolExecutor ## ThreadPoolExecutor为一些Executor提供了基本的实现,这些Executor是由Executors中newCachedThreadPool、newFixedThreadPool等方法返回的。ThreadPoolExecutor是一个灵活的、稳定的线程池,允许进行各种定制。 public ThreadPoolExecutor(int corePoolSize,//线程池的基本大小 int maximumPoolSize,//最大大小 long keepAliveTime,//存活时间 Timeout unit, SlockingQueue<Runable> workQueue, ThreadFactory threadFactory, RejectExecutionHandler handler){...} 通过调节线程池的基本大小和存活时间,可以帮助线程池回收空闲线程占有的资源。 * newFixedThreadPool工厂方法将线程池的基本大小和最大大小设置为参数中指定的值,而且创建的线程池不会超时。 * newCachedThreadPool工厂方法将线程池的最大大小设置为Integer.MAX\_VALUE,而将基本大小设置为零,并将超时设置为1分钟,这种方式创建出来的线程池可以无限扩展,并且当需求降低会自动收获。 //对通过标准工厂方法创建的Executor进行修改 ExecutorService exec = Execoutors.newCachedThreadPool(); if(exec instanceof ThreadPoolExecutor) ((ThreadPoolExecutor) exec).setCorePoolSize(10); else throw new AssertionError(*Oops, bad assumption);
还没有评论,来说两句吧...