线程池
JDK1.5以后提供了一个线程池执行器,可以使用线程池执行一组任务。先看一下示例,代码来自于JDK文档。
class NetworkService {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize) throws IOException {
serverSocket = new ServerSocket(port);
//创建线程池
pool = Executors.newFixedThreadPool(poolSize);
}
public void serve() {
try {
for (;;) {
//使用线程池执行Runnable任务
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
/*
需要执行的任务。
*/
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request
}
}
示例代码使用工厂Executors创建了一个固定大小的线程池,并且使用线程池来执行Runnable任务。示范了使用线程池的基本的步骤:创建线程池,使用线程池执行任务。
关于线程池的说明
1、 池的大小。池有一个CoreSize和MaximumSize,当池中线程小于CoreSize时,使用execute执行任务,线程池会创建一个线程来执行任务,即使池中有空闲的线程。如果线程池中线程数目在CoreSize和MaximumSize之间,如果任务队列满了,不能缓存任务,线程池会创建新的线程来执行新来的任务。CoreSize和MaximumSize一样时,就创建了一个固定大小的线程池。MaximumSize甚至可以设置成Integer.MAX_VALUE,每一个并发任务都不会等待。可以使用setCorePoolSize(int)和
setMaximumPoolSize(int)来设置池的大小。
2、 线程的激活时间。对于池中超过CoreSize的线程,如果空闲了一段时间,线程池会自动终止线程以减少资源消耗。这个时间通过setKeepAliveTime(long, java.util.concurrent.TimeUnit)来设置。
.
3、
线程的创建。默认使用Executors.defaultThreadFactory()来创建线程,这些线程属于一个组,有普通的优先级,非daemon状态。如果有不同的需求,可以自己实现一个ThreadFactory,提供给Executors创建线程池。譬如使用以下语句创建线程池, newFixedThreadPool
(int nThreads, ThreadFactory threadFactory)
4、 任务队列的大小。任意的BlockingQueue都可以作为任务队列。任务队列和线程池的交互:
i. 线程数小于CoreSize,总是新建线程,不管Queue如何
ii. 如果线程数目等于或大于CoreSize,Queue优先缓存任务。
iii. 如果线程数目小于MaximumSize,Queue已经满,创建线程。如果线程数目达到MaximumSize,Queue满,拒绝任务,扔出RejectedExecutionException。
任务队列的策略:
1. 不缓存。每一个任务进来立即处理,要求无界 maximumPoolSizes 以避免拒绝新提交的任务,适合处理有内部依赖的任务。
2. 无界队列。当线程达到CoreSize时,缓存任务,适合处理没有依赖的任务。
3. 有边界的队列。当使用有限的 maximumPoolSizes 时,有界队列(如 ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O 边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU 使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
分享到:
相关推荐
1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled
Java多线程知识的理解0.前言1.从一道题目引入2.创建线程2.1.继承Thread类2.2.实现Runnable接口3.线程的生命周期4.线程安全4.1.为什么需要线程安全?4.2.如何实现线程安全?5.线程池5.1.为什么需要线程池?5.2.创建...
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...
Java多线程①——线程知识梳理 有助于新手初步了解线程相关的知识同时加深对基础的理解。 了解线程的状态、常用方法以及Thread、Runnable、Callable、Future、FutureTask这些基础概念和简单应用。 Java多线程②——...
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....
这里我们为大家分享上海创行科技技术总监严澜的博文——Java线程池管理及分布式Hadoop调度框架搭建。平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很...
1多线程 1.1如何设置线程池线程数? 任务一般可分为:CPU密集型,IO密集型,混合型,对于不同类型的任务需要分配不同大小的线程池。 CPU密集型任务 尽量使用较小的线程池,一般为CPU核心数+1 。因为CPU密集型任务...
│ │ 9.JAVA并发编程之多线程并发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11....
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
java多线程笔试题Hammer 是一个解析库。 像许多现代解析库一样,它提供了一个解析器组合器接口,用于将语法编写为内联域特定语言,但 Hammer 也提供了各种解析后端。 它也是面向位而不是面向字符的,因此非常适合...
目录回到顶部↑第1章 进驻爪哇岛——JAVA的基本语法. 1 1.1 讲解 2 1.1.1 爪哇岛的历史与演变 2 1.1.2 爪哇岛基本生存规则 4 1.1.3 爪哇岛上新人新风尚 11 1.2 练习 15 1.2.1 搭建Java开发环境 15 1.2.2 体验...
多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable / runnable FutureTask JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ...
目录回到顶部↑第1章 进驻爪哇岛——JAVA的基本语法. 1 1.1 讲解 2 1.1.1 爪哇岛的历史与演变 2 1.1.2 爪哇岛基本生存规则 4 1.1.3 爪哇岛上新人新风尚 11 1.2 练习 15 1.2.1 搭建Java开发环境 15 1.2.2 体验...
目录回到顶部↑第1章 进驻爪哇岛——JAVA的基本语法. 1 1.1 讲解 2 1.1.1 爪哇岛的历史与演变 2 1.1.2 爪哇岛基本生存规则 4 1.1.3 爪哇岛上新人新风尚 11 1.2 练习 15 1.2.1 搭建Java开发环境 15 1.2.2 体验...
——Bruce Eckel,《Thinking in Java》的作者 内容简介回到顶部↑《Java网络编程》第三版会为你介绍Java网络API的最新特性。本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,...
——Bruce Eckel,《Thinking in Java》的作者 内容简介回到顶部↑《Java网络编程》第三版会为你介绍Java网络API的最新特性。本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,...