服务器应用中,串行处理机制通常无法提供高吞吐率或快速响应性。通过为每个请求创建一个新的线程来提供服务,从而实现更高的响应性。

public class ThreadPerTaskWebServer {public static void main(String[] args) throws IOException {ServerSocket socket = new ServerSocket(80);while (true) {final Socket connection = socket.accept();Runnable task = new Runnable() {public void run() {handleRequest(connection);}};new Thread(task).start();}}private static void handleRequest(Socket connection) {//do something}
}

对于每个连接,主循环都将创建一个新线程来处理请求,而不是在主循环中进行处理。

在生产环境中,“为每个任务分配一个线程”这种方法存在一些缺陷,尤其是当需要创建大量线程时:

  1. 线程生命周期的开销非常高。线程的创建和销毁不是没有代价的。
  2. 资源消耗。活跃的线程会消耗系统资源,尤其是内存。
  3. 稳定性。在可创建线程的数量上存在一个限制,这个限制值将随着平台的不同而不同,并且受多个因素制约。

Executor接口

public interface Executor{void executor(Runnable command);
}

线程池

Executors 静态工厂方法创建

  • newFixedThreadPool 创建一个固定长度的线程池
  • newCachedThreadPool 创建一个可缓存的线程池 规模不存在限制
  • newSingleThreadPool 创建单个工作者线程来执行任务 异常后会替代
  • newScheduledThreadPool 创建一个固定长度的线程池 以延时或定时方式来执行

以上实际都是通过ThreadPoolExecutor来创建的

public class Executors {public static ExecutorService newFixedThreadPool(int var0) {return new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());}public static ExecutorService newFixedThreadPool(int var0, ThreadFactory var1) {return new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), var1);}public static ExecutorService newSingleThreadExecutor() {return new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()));}public static ExecutorService newSingleThreadExecutor(ThreadFactory var0) {return new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), var0));}//...
}

ThreadPoolExecutor 核心线程池的内部实现

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
  1. corePoolSize 指定了线程池中线程数量
  2. maximumPoolSize 指定了线程池中最大线程数量
  3. keepAliveTime 当线程池数量超过corePoolSize时,多余的空闲线程的存活时间
  4. unit keepAliveTime 的单位
  5. workQueue 任务队列 被提交但尚未被执行的任务
  6. threadFactory 线程工厂 用于创建线程,一般用默认的即可
  7. handler 拒绝策略。当任务太多来不及处理,如何拒绝任务

workQueue 可以是以下几种:
直接提交的队列:SynchronousQueue
有界的任务队列:ArrayBlockingQueue
无界的任务队列:LinkedBlockingQueue
优先任务队列:PriorityBlockingQueue

扩展线程池(extends java.util.concurrent.ThreadPoolExecutor)

ThreadFactory 线程工厂

每当线程池需要创建一个线程时,都是通过线程工厂方法来完成的。

public interface ThreadFactory{Thread newThread(Runnable r);
}

Executors中提供一个默认线程工厂的实现DefaultThreadFactory

  static class DefaultThreadFactory implements ThreadFactory {private static final AtomicInteger poolNumber = new AtomicInteger(1);private final ThreadGroup group;private final AtomicInteger threadNumber = new AtomicInteger(1);private final String namePrefix;DefaultThreadFactory() {SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() :Thread.currentThread().getThreadGroup();namePrefix = "pool-" +poolNumber.getAndIncrement() +"-thread-";}public Thread newThread(Runnable r) {Thread t = new Thread(group, r,namePrefix + threadNumber.getAndIncrement(),0);if (t.isDaemon())t.setDaemon(false);if (t.getPriority() != Thread.NORM_PRIORITY)t.setPriority(Thread.NORM_PRIORITY);return t;}}

Executor的生命周期

为了解决执行服务的生命周期问题,Executor扩展了ExecutorService接口,添加了一些用户生命周期管理的方法(还有一些用于任务提交的便利方法)。

public interface ExecutorService extends Executor{void shutdown();List<Runnable> shutdownNow();boolean isShutdown();boolean isTerminated();<T> Future<T> submit(Callable<T> task);// .....
}

ExecutorService的生命周期有三种状态:运行,关闭和已终止

平缓的关闭方式–shutdown:不再接受新的任务,同时等待已经提交的任务执行完成( 包括那些还未开始执行的任务 )。
粗暴的关闭方式–shutdownNow:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。

JVM只有在所有非守护线程全部终止后才会退出,如果无法正确地关闭Executor,那么JVM将无法结束。

转载于:https://www.cnblogs.com/lucare/p/9312662.html

Executor框架相关推荐

  1. 转: java并发编程-Executor框架

    Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...

  2. Java基础篇:Executor框架

    文章目录 概述 Executor框架结构 Executor框架的使用示意图 `ThreadPoolExecutor`类介绍 `ThreadPoolExecutor` 类分析 推荐使用 `ThreadP ...

  3. 【初识】-JUC·Executor框架

    前言 多线程和并发这两个东西真的是向往已久,总是有一种神秘的感觉,想去探索一波,又担心水平不够无法驾驭.想以读书笔记的方式来写,但是又觉得缺少自己的一些思考:但是在没有足够并发编程经验的情况下又没法去 ...

  4. Java基础系列--Executor框架(一)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8393618.html 一.Executor框架介绍 Executor框架是JDK1.5之后 ...

  5. Executor框架的详解(转载)

    在Java中,使用线程来异步执行任务.Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源.同时,为每一个任务创建一个新线程来执行 ...

  6. 【并发编程】线程池--Executor框架

    简介 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,Eexecutor作为灵活且强大的异步 ...

  7. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础--线程安全性 Java 并发编程--Callable+Future+FutureTask java 并发编程--Thread 源码重新学习 java并发 ...

  8. Java高并发编程(十二):Executor框架

    Java中的线程既是工作单元,也是执行单元.工作单元包括Runnable和Callable,而执行单元是由Executor框架支持. 1. Executor框架简介 ExecutorsService的 ...

  9. 线程池框架_Java并发——Executor框架详解(Executor框架结构与框架成员)

    一.什么是Executor框架? 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1 ...

  10. [并发编程] - Executor框架#ThreadPoolExecutor源码解读03

    文章目录 Pre execute源码分析 addWorker()解读 Worker解读 Pre [并发编程] - Executor框架#ThreadPoolExecutor源码解读02 说了一堆结论性 ...

最新文章

  1. 扩展Ext2类 Extending Ext2 Class
  2. C语言实现基数排序Radix sort算法之一(附完整源码)
  3. 【Leetcode - 172】阶乘后的零(思维)
  4. numpy存储特征:消耗内存和计算速度测试
  5. React 是如何成为跨越前端开发鸿沟的桥梁?
  6. 宣布正式发布 Azure 媒体服务内容保护服务
  7. mysql 加速_DBA大牛MySQL优化心得,语句执行加速就是这么简单!
  8. 【CSS】关于表单样式
  9. 腾讯云发布容器安全白皮书
  10. 2022-2028全球针织捆包网行业调研及趋势分析报告
  11. Linux下构建一个deb软件安装包
  12. 移动硬盘linux读取失败,无法读取移动硬盘|无法识别的6种修复方法插图
  13. 企业微信渠道二维码如何制作?
  14. Android开发学习之路--UI之简单聊天界面
  15. 如何用15秒打动对方
  16. SSH远程访问以及控制
  17. 根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。比如G198次列车从青岛站出发时间为16:00,到达北京南站的时间为20:40,则整个旅途所用时间为04:40。
  18. 读书笔记-在工作中保持充沛的体力
  19. i春秋百度杯CTF比赛2016年12月场writeup
  20. 【考研政治】2021肖八整理(时政部分)

热门文章

  1. feign返回null_109、Feign的服务降级和Turbine
  2. python 累加器_Python编程第5课:累加器,变量与赋值进阶练习
  3. 多视图几何总结——等距变换、相似变换、仿射变换和射影变换
  4. 【AI产品】一键去除杂物,Photo Eraser助你拍出美丽照片
  5. “有三AI百人”专栏作者培养计划启动,爱写作的你还等什么呢?
  6. lazadashopee代运营服务有哪些,能帮商家解决哪些问题?
  7. 有关缅甸语学习的一些网站
  8. eclipse中导入spring-boot框架的jar包方法
  9. 如何绘制漂亮的多序列比对图片
  10. 苹果的 Metal 工程