java中如何使用线程池呢?
下文笔者将讲述常用的四种线程池简介说明,如下所示
线程池简介
线程池可控制系统中运行线程的数量 使系统性能处于最佳状态
使用线程池的优点
1.减少创建和销毁线程的次数 每个工作线程都可以被重复利用 可运行多个任务 2.根据系统的承受能力 调整线程池中工作线线程的数目 避免同时开启多个线程,导致内存耗时,系统停止服务的现象(如:OOM)
线程池的实现方式
在Java代码中,实现线程池可使用以下方式 newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool
newSingleThreadExecutor
创建一个单线程的线程池 这个线程池只有一个线程在工作 也就是相当于单线程串行执行所有任务 如果这个唯一的线程因为异常结束 那么会有一个新的线程来替代它 此线程池保证所有任务的执行顺序按照任务的提交顺序执行。例
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); }
newFixedThreadPool
创建固定大小的线程池 每次提交一个任务就创建一个线程 直到线程达到线程池的最大大小 线程池的大小一旦达到最大值就会保持不变 如果某个线程因为执行异常而结束,此时线程池会补充一个新线程例
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); }
newCachedThreadPool
创建一个可缓存的线程池 当线程池的大小超过处理任务所需要的线程, 则会回收部分空闲(60秒不运行任务)线程 当任务数增加时,此线程池又可智能的添加新线程来处理任务 此线程池模式不会对线程池大小做限制 线程池大小完全依赖于操作系统(或JVM)能够创建的最大线程大小例
ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(index * 1000); } catch (Exception e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { public void run() { System.out.println(index); } }); }
newScheduledThreadPool
创建一个大小无限的线程池 此线程池支持定时以及周期性执行任务的需求。例
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("delay 1 seconds, and excute every 3 seconds") } }, 1, 3, TimeUnit.SECONDS);
线程池中常用参数说明
corePoolSize:池中所保存的线程数,包括空闲线程 maximumPoolSize:池中允许的最大线程数 keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间 unit:keepAliveTime 参数的时间单位 workQueue:运行前用于保持任务的队列。 此队列仅保持由 execute方法提交的 Runnable任务 threadFactory:运行程序创建新线程时使用的工厂 handler:当超出线程范围和队列容量而使执行被阻塞时所使用的处理程序
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。