ExecutorService | 真正的线程池接口 |
ScheduledExecutorService | 能和Timer/TimerTask类似,解决那些需要任务重复执行的问题 |
ThreadPoolExecutor | ExecutorService的默认实现 |
ScheduledThreadPoolExecutor | 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现 |
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize:核心池的大小
maximumPoolSize:池中允许的最大线程数
keepAliveTime:当线程数大于核心池的大小,终止空闲线程等待新任务的最长时间
unit:keepAliveTime参数的时间单位
workQueue:执行前用于保持任务的队列
threadFactory:线程创建工厂
handler:由于超出线程范围和队列容量而使执行被阻塞时,表示拒绝处理的策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
Executors是一个工具类,提供一些静态工厂,生成一些常用较优的线程池(建议使用,不用了解线程池原理)
newSingleThreadExecutor:单线程的线程池,串行执行所有任务,只有当前线程异常结束时才会新的线程来替代它。
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
}
newFixedThreadPool:固定大小的线程池。根据任务量,逐渐增加线程数,直到线程池最大值保持不变。只有线程异常结束时才会新的线程来补充。
Runtime.getRuntime().availableProcessors()
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
newCachedThreadPool:可缓存的线程池,可以理解为可复用的线程池,当线程处于空闲状态(60秒未执行任务)执行回收,有需要再创建新的线程。该线程池未做大小限制,依赖JVM可以创建的最大线程数(默认线程大小1024k)。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
newScheduledThreadPool:创建一个定长线程池,此线程池支持定时以及周期性执行任务的需求
SynchronousQueue:没有数据缓冲的BlockingQueue,每个插入操作必须等待另一个线程的对应移除操作
LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE
引用
以上两篇文章讲的很详细,感谢作者!
分享到:
相关推荐
在深入探讨自定义Java线程池之前,我们先简要回顾一下线程池的基本概念及其重要性。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制运行的线程数量...
9. Class36.java:可能关于线程池的使用,如`ExecutorService`和`ThreadPoolExecutor`,理解线程池的工作原理和优化策略。 10. Class11.java:可能讨论设计模式,如单例模式、工厂模式、观察者模式等,这些都是解决...
配合`JAVA多线程总结.ppt`,你可以得到一个更直观和简洁的概览,快速回顾和掌握上述关键知识点。虽然中文版翻译可能存在不足,但原版英文书籍通常能更准确地传达作者的意图和细节,值得深入阅读。
【标题】"Tank版2016Java"指的是一个特定版本...总的来说,“Tank版2016Java”可能会涵盖上述知识点,提供关于Java 8的使用、Spring框架的应用、多线程编程的最佳实践等,对于学习和回顾2016年Java开发具有很高的价值。
1. **Java基础**:虽然不是初学者入门教程,但书中会回顾Java的基础,如语法、类、对象、接口、异常处理等,为深入探讨打下坚实基础。 2. **面向对象设计**:深入讨论了如何利用Java进行高效、可维护的面向对象设计...
- **线程池**:ExecutorService接口和ThreadPoolExecutor类提供了线程池管理,可以提高系统效率并简化线程管理。 - **并发工具类**:如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(倒计时 ...
这部分内容可能会讲解Thread类的使用、实现Runnable接口、线程同步机制(如synchronized关键字、wait()和notify()方法)、线程池的创建和使用(如ExecutorService)等。掌握多线程编程能够提高程序的效率和响应性,...
Java是世界上最流行的编程语言之...2008年的Java试题可以帮助我们回顾当年的Java技术生态,并与现代Java进行对比,理解技术的演进和发展。通过学习这些试题,不仅可以巩固基础,还能深入理解Java的核心理念和最佳实践。
这些是所有Java开发者必须掌握的基础知识,无论你是初学者还是有经验的开发者,回顾和巩固这些基础知识总是有益的。 在面向对象编程方面,该文档可能会深入讨论接口、抽象类、访问修饰符、构造器、异常处理和内省等...
### Java面试精华14:如何获取线程异步执行的结果 在Java多线程编程中,经常需要异步地执行一些任务并获取这些任务的结果。本文将深入探讨如何利用Java提供的`Runnable`与`Callable`接口配合`Future`或`FutureTask`...
5. Java第2版教材课件05.ppt和07.ppt:这部分内容可能深入到多线程编程,包括线程的创建、同步与通信,以及线程池的使用。 6. Java第2版教材课件14.ppt:可能介绍了Java的高级特性,如反射、动态代理、注解等,以及...
8. **并发编程改进**:Java 5引入了`java.util.concurrent`包,提供了高级并发工具,如线程池、并发容器和同步工具类,如Semaphore、CyclicBarrier等,提升了多线程编程的效率和可控性。 9. **NIO(非阻塞I/O)**:...
总的来说,这份"Java期末复习资料"提供了全面的复习内容,帮助学生系统地回顾和巩固Java知识,为考试做好充分准备。在复习过程中,不仅要熟记理论知识,更要通过实践来提升编程能力。同时,不断查阅官方文档,参考...
## Java的主要特点回顾 1. **跨平台性**:Java程序可以在任何安装了Java虚拟机(JVM)的平台上运行,无需重新编译。 2. **面向对象**:Java支持封装、继承和多态等面向对象特性。 3. **健壮性**:Java语言设计时...
1. **Java基础知识**:本书首先回顾了Java的基础,包括语法、数据类型、流程控制语句、类和对象等,确保读者具备坚实的编程基础。 2. **面向对象编程**:深入探讨Java的面向对象特性,如封装、继承和多态,以及接口...
CH8Thread可能包含了线程的创建、线程同步、锁机制、线程池等主题的实例,帮助学习者理解如何在并发环境中有效地管理资源和控制执行顺序。 3. **I/O流** (CH7IO) Java的I/O流系统非常强大,支持对文件、网络和内存...
### Java核心技术 #### 1. ConcurrentHashMap的数据结构和并发安全机制 **数据结构**:`ConcurrentHashMap`在设计上充分考虑了并发环境下的性能优化。早期版本(Java 7及之前)采用的是分段锁机制,即将整个哈希表...
在系统中,某些对象只需要一个实例,例如,线程池、缓存或者数据库连接池等。在本项目中,可能使用单例模式来创建和管理共享的西瓜市场资源,如数据存储或全局配置。 2. **代理模式**: 代理模式为一个对象提供一...
线程池(ThreadPool)是多线程管理的重要工具,它可以有效地控制并发执行的任务数量,提高系统资源利用率。 【Servlet与Filter】 Servlet是Java Web开发中的核心组件,用于处理HTTP请求。Filter则允许在请求到达...