关注Java线程池的任务队列长度
Java 5.0 就开始自带线程池的实现,其中固定大小的线程池,对普通使用还是很好用的。就是 Executors.newFixedThreadPool ,指需要指定一个大小数目就可以。相对于其他几种方式,易于实现高效稳定的服务器。
但是好用归好用,一些需要非常细心的问题,还是需要关注的,尤其是高并发场景,7*24不间断运行场景下。本文就是把这些地方记录下来,在设计和实现时,在这些问题上务必不能马虎,因为这关系到稳定性和效率,且不易通过测试来排查。
(1)实现:
几种线程池,都是通过 ThreadPoolExecutor 来实现的,如下:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime, TimeUnit unit,BlockingQueue workQueue,RejectedExecutionHandler handler)newFixedThreadPool :
public static ExecutorService newFixedThreadPool(int paramInt){return new ThreadPoolExecutor(paramInt, paramInt, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());}
而 LinkedBlockingQueue的实现:
public LinkedBlockingQueue()
this(2147483647);
这个默认的构造函数,实
关注Java线程池的任务队列长度Java 5.0 就开始自带线程池的实现,其中固定大小的线程池,对普通使用还是很好用的。就是 Executors.newFixedThreadPool ,指需要指定一个大小数目就可以。相对于其他几种方式,易于实现高效稳定的服务器。但是好用归好用,一些需要非常细心的问题,还是需要关注的,尤其是高并发场景,7*24不间断运行场景下。本文就是把这些地方记录下来,在设计和实...
Java
通过Executors提供四种
线程池
,分别为:
newCachedThreadPool创建一个可缓存
线程池
,如果
线程池
长度
超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长
线程池
,可控制线程大并发数,超出的线程会在
队列
中等待。
newScheduledThreadPool 创建一个定长
线程池
,支持定时及周期性
任务
执行。
newSingleThreadExecutor 创建一个单线程化的
线程池
,它只会用的工作线程来执行
任务
,保证所有
任务
按照指定顺序(FIFO, LIFO, 优先级)执行。
(1) n
线程池
中的
队列
要求的是阻塞
队列
,作用主要是当
线程池
处理
任务
能力不足时,
队列
存储多余的
任务
,从而起到削峰和缓冲的目的。
可以选择的
队列
种类很多,如何选择合适的
队列
应用到自己的
线程池
中?就需要了解他们的优缺点,从而择优使用
1、常见阻塞
队列
常见的阻塞
队列
都是以基于BlockingQueue的实现
ArrayBlockingQueue
一个基于数组结构的有界阻塞
队列
,此
队列
按 FIFO(先进先出)原则对元素进行排序。
LinkedBlockingQueue
一个基于链表结构的有界阻塞
队列
(不设置大小时,默认
线程池
一、
线程池
的概念二、
线程池
原理三、
线程池
API1.接口定义和实现类2.方法定义3.
任务
执行过程4.Excutors 工具类四、如何确定线程数量
一、
线程池
的概念
线程池
是一种多线程处理形式,处理过程中将
任务
添加到
队列
,然后在创建线程后自动启动这些
任务
。
线程池
线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件...
import
java
.util.concurrent.ArrayBlockingQueue;
import
java
.util.concurrent.BlockingQueue;
import
java
.util.concurrent.Callable;
import
java
.util.concurrent.Future;
import
java
.util.concurrent.ThreadPoolExecutor;
import
java
.util.concurrent.TimeUn
全部代码出自电子工业出版社夏先波的《
Java
JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取
Java
应用的典型实例,循序渐进地介绍了
Java
语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。
第1章 ...
Executor 是一个接口, 它是 Executor 框架的基础, 它将
任务
的提交与
任务
的执行分离开来。
ExecutorService 接口继承了 Executor【原来接口是可以继承接口的】, 在其上做了一些shutdown()、 submit()的扩展, 可以说是真正的
线程池
接口。
AbstractExecutorService 抽象类实现了 ExecutorService 接口中的大部分方法。
ThreadPoolExecutor 是线程
import
java
.util.concurrent.*;
public class ExecutorTest {
public static void main(String[] args) {
// 创建
线程池
, 参数含义 :(核心线程数,最大线程数,加开线程的存活时间,时间单位,
任务
队列
长度
)
ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 8,
0L, Ti.
1、什么是
线程池
线程池
就是首先创建一些线程,它们的集合称为
线程池
,使用
线程池
可以很好的提高性能。
线程池
在系统启动时就创建大量空闲的线程,程序将一个
任务
传给
线程池
。
线程池
就会启动一条线程来执行这个
任务
,执行结束后,该线程并不会死亡,而是再次返回
线程池
中成为空闲状态,等待执行下一个
任务
。
2、为什么使用
线程池
在执行异步
任务
或并发
任务
时,如果通过 new Thread() 方式创建新的线程,当系统不断的启动和关闭新线程以及过渡切换线程,会过度消耗系统资源,成本非常高,从而导致系统资源的崩溃,这时线
1.继承Thread类创建多线程:定义一个类继承Thread类,重写run方法,创建该类的实例对象,调用start方法启动线程。
2.实现Runnable接口创建多线程:定义一个类实现runnable接口,创建该类的实例对象o,将o作为构造器参数传入Thread类实例对象,调用start方法启动线程。
3.通过Callable和Future接口创建多线程:创建callable的实...