线程执行者(三)创建一个大小固定的线程执行者
创建一个大小固定的线程执行者
当你使用由Executors类的 newCachedThreadPool()方法创建的基本ThreadPoolExecutor,你会有执行者运行在某一时刻的线程数的问题。这个执行者为每个接收到的任务创建一个线程(如果池中没有空闲的线程),所以,如果你提交大量的任务,并且它们有很长的(执行)时间,你会使系统过载和引发应用程序性能不佳的问题。
如果你想要避免这个问题,Executors类提供一个方法来创建大小固定的线程执行者。这个执行者有最大线程数。 如果你提交超过这个最大线程数的任务,这个执行者将不会创建额外的线程,并且剩下的任务将会阻塞,直到执行者有空闲线程。这种行为,保证执行者不会引发应用程序性能不佳的问题。
在这个指南中,你将继续学习怎样创建一个大小固定的线程执行者,然后修改本章第一个示例的实现。
准备工作…
你应该事先阅读本章的创建线程执行者指南,并且实现所有演示的示例,因为接下来你需要继续修改这些示例。
这个指南的例子使用Eclipse IDE实现。如果你使用Eclipse或其他IDE,如NetBeans,打开它并创建一个新的Java项目。
如何做…
按以下步骤来实现的这个例子:
1.实现本章第一个指南描述的示例,打开Server类,修改它的构造器。使用newFixedThreadPool()方法创建执行者并传入5作为参数。
2.修改executeTask()方法,包含额外的日志信息行。调用getTaskCount()方法,获取已经提交给执行者的任务数。
它是如何工作的…
在本例中,你已经使用Executors类的newFixedThreadPool()方法来创建执行者。这个方法创建一个有最大线程数的执行者。如果你提交超过最大线程数的任务,剩下的任务将会被阻塞,直到有空闲的线程来处理它们。这个方法接收一个你想要让执行者拥有最大线程数的参数。在你的例子中,你已经创建了拥有5个线程的执行者。
以下截图展示了执行这个示例输出的一部分:
写入的程序输出到控制台,你已经使用了ThreadPoolExecutor类的一些方法,包括:
getPoolSize():此方法返回线程池实际的线程数。 getActiveCount():此方法返回在执行者中正在执行任务的线程数。你可以看出这些方法的输出是5,表明执行者有5个线程。它本没有超出既定的最大线程数。
当你提交最后的任务给执行者,它只有5个活动的线程。剩下的95个任务将等待空闲线程。我们使用getTaskCount()方法来显示有多少个任务已经提交给执行者。
不止这些…
Executors类同时提供newSingleThreadExecutor()方法。这是大小固定的线程执行者的一个极端例子。它创建只有一个线程的执行者,所以它在任意时刻只能执行一个任务。
参见
在第4章,线程执行者中的创建线程执行者指南 在第8章,测试并发应用程序中的监控Executor framework指南线程执行者(七)执行者延迟运行一个任务 声明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González 译者:许巧辉 校对:方腾飞,叶磊 执行者延迟运行一个任务 执行者框架提供ThreadPoolExecutor类,使用池中的线程来执行Callable和Runnable任务,这样可以避免所有线程的创建操作。
线程执行者(六)运行多个任务并处理所有结果 声明:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González 译者:许巧辉 校对:方腾飞,叶磊 运行多个任务并处理所有结果 执行者框架允许你在不用担心线程创建和执行的情况下,并发的执行任务。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- 线程执行者(十)执行者控制一个任务完成
- SV中的线程
- 在Linux中使用线程
- 如何停止一个正在运行的java线程
- Thread 如何安全结束一个线程 MD
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
- android--线程
- 进程、线程和协程之间的区别和联系
- 重新整理操作系统概念系类——线程和多线程模型
- JVM是如何实现线程的?
- jvm一个线程的成本
- 详解线程本地变量ThreadLocal
- 进程与线程的一个简单解释
- Java里使用volatile进行线程同步的一个例子
- Qt创建线程的几种方式_创建一个新线程的方法
- 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
- 为什么spring Boot是一个线程处理一个web请求而不是一个线程处理一次tcp连接?
- 一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
- Java并发学习之中的一个——线程的创建
- 【高并发】通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程
- 我们该如何正确的中断一个线程的执行??
- 008-多线程-锁-JUC锁-CyclicBarrier【让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行】
- 007-多线程-锁-JUC锁-CountDownLatch-闭锁【允许一个或多个线程,等待其他一组线程完成操作,再继续执行】
- Java如何获取正在运行的线程的Id?
- Java如何检查一个线程停止或没有?
- 启动一个线程是用run()还是start()?
- 一个线程可以拿到多个锁标记,一个对象最多只能将monitor给一个线程
- 我是一个线程(修订版)