Java 线程池
首先来跑一个最简单的线程池例子:
1 2 3 4 5 6 7 | public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newFixedThreadPool( 10 ); executorService.submit( ()-> {System.out.println( "1" );}); } |
上面是一个最简单的固定线程池的例子。起了容量为10 的线程池;
看 上面你的图 Java 提供的 线程池的方法。
newFixedThreadPool 得到的是一个固定的线程池,可以定指定 线程工厂 指定线程的创建过程;
newFixedThreadPool 返回的是一个 ThreadPoolExecutor 对象,这个对象的 AbstractExecutorService 的 子类 ,AbstractExecutorService 是 ExecutorService 的 抽象类。
所以继承关系 ThreadPoolExecutor -->AbstractExecutorService -->ExecutorService ->Executor
ThreadPoolExecutor 这个类和很关键 里面有大量的关系线程池的属性
corePoolSize 核心线程数,maximumPoolSize 最大的线程数,keepAliveTime 线程活多久 会被销毁,unit 时间 单位,
workQueue 工作队列需要 特殊说明一下,这个是线程池队列的工作方式,链表,数组,延时队列或者优先级队列什么的。
这个篇文章介绍的还比较详细:https://www.cnblogs.com/KingIceMou/p/8075343.html
RejectedExecutionHandler handler 顾名之意 在线程池拒绝加入新任务的时候应该怎么办,默认的直接排除拒绝异常
Executors.newCachedThreadPool() 得到一个 初始 大小0 ,最大 Integer.MAX_VALUE 的 一个线程池,需要注意的这个对象,只要请求线程的时候没有可用线程,就会自动扩容。相当于无限线程池。但是他会回收 10 秒没有任务的线程。
Executors.newFixedThreadPool(nThreads) 固定大小的线程池。不会回收空闲线程
Executors.newScheduledThreadPool(corePoolSize) 这是一个可以定时的线程池。可以定时执行 线程对象,下面的图可以看待产生的对象都不一样了。请求实现了定时借口 ,
实现了 ScheduledExecutorService 接口 , schedule 定时方法,也就是 说这个线程会在 延时 一定时间后执行。
Executors.newSingleThreadExecutor() 一个单线程的线程池。
Executors.newSingleThreadScheduledExecutor() 可以定时的 单线程 线程池。
Executors.newWorkStealingPool() 这个是jdk 7 新添加的 根据cpu 的数量来创建的线程池。
ExecutorService 可以加入一个 执行 一个线程
参数可以 Runnable 也可以是 Callable<T> task ,区别是有没有返回。 返回值 Future 对象 get 方法是阻塞 的,需要等待线程返回才能得到。
线程池 需要手动调用 e.shutdown(); 或者 e.shutdownNow() 销毁。区别在于e.shutdown(); 会执行完未执行 完成的任务。 e.shutdownNow() 会让正在执行的线程抛出 打断 interrupt 异常。然后终止。
掉了shutdown之类的方法线程池的状态就变 e.isShutdown() 为 true,但是这时 的 isTerminated() 可能还是 false 需要等 所有线程都子线程都终止了才是 isTerminated() 才是true。
能耍的时候就一定要耍,不能耍的时候一定要学。
--天道酬勤,贵在坚持posted on 2018-07-09 16:18 zhangyukun 阅读(135) 评论(0) 编辑 收藏 举报
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 大模型 Token 究竟是啥:图解大模型Token
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· BotSharp + MCP 三步实现智能体开发
· BotSharp 5.0 MCP:迈向更开放的AI Agent框架
· 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
· 【ESP32】两种模拟 USB 鼠标的方法
· 设计模式脉络