Java并发编程(7)-ThreadPoolExecutor的饱和策略

面试官狂喜!我用这 5 分钟讲清了 ThreadPoolExecutor 饱和策略,逆袭上岸 写入日志记录被拒绝的任务;把任务持久化到消息队列;甚至可以报警提示线程池处理能力不足。你只需要把这个 handler 配到 ThreadPoolExecutor 构造函数里即可。线程池很强大,但你得知道它的极限在哪里。当线程池处理不过来了,任务还在飞快地来,这时候它会“饱和”——你要知道它会怎么“拒绝”。这就是 RejectedExecutionHandler 的职责!你可以选择抛异常、丢任务、让自己执行、甚至把最老的赶走,也可以……自定义规则。别等出问题时才想起它——像我一样就晚了。 阅读详情


更多关于Java并发编程的文章请点击这里:Java并发编程实践(0)-目录页


本文将介绍ThreadPoolExecutor的饱和策略以及ThreadPoolExecutor的扩展方法;当线程充满了ThreadPool的有界队列时,饱和策略开始起作用。饱和策略可以理解为队列饱和后,处理后续无法入队的任务的策略。在JDK中预先提供了几种饱和策略,ThreadPoolExecutor可以通过调用setRejectedExecutionHandler来修改饱和策略。ThreadPoolExecutor在设计的时候就支持扩展其方法,主要为前处理beforeExecute、后处理afterExecute`以及执行完毕处理terminated。

一、ThreadPoolExecutor的饱和策略

1.1、什么是饱和策略

当线程充满了ThreadPool的有界队列时,饱和策略开始起作用。**饱和策略可以理解为队列饱和后,处理后续无法入队的任务的策略。**在JDK中预先提供了几种饱和策略,ThreadPoolExecutor可以通过调用setRejectedExecutionHandler来修改饱和策略。

1.2、Abort策略

ThreadPoolExecutor的 默认策略,新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获。

@Test
    public void testPolicy() {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
                5,
                0,
                TimeUnit.MICROSECONDS,
                new ArrayBlockingQueue<Runnable>(5));
        //设置饱和策略为AbortPolicy
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        //测试
        for (int i = 1; i <= 11; i++) {

            int count = i;
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    //模拟耗时操作
                    for (int j = 0; j < 100000; j++) {
                        //...
                    }
                    System.out.println("这是第" + count + "个线程在执行任务----" + Thread.currentThread().getName());
                }
            });


        }
    }

运行后,由于设置了核心池线程数为5,有界队列能存储的线程数为5,故一共只有10个任务能被执行,多余的那1个任务将被以异常的形式抛出。
在这里插入图片描述

1.3、CallerRuns策略

既不抛弃任务也不抛出异常,而是将某些任务回退到调用者,让调用者去执行它。

@Test
   public void testPolicy() {
       ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
               5,
               0,
               TimeUnit.MICROSECONDS,
               new ArrayBlockingQueue<Runnable>(5));
       //设置饱和策略为AbortPolicy
       executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
       //测试
       for (int i = 1; i <= 11; i++) {

           int count = i;
           executor.execute(new Runnable() {
               @Override
               public void run() {
                   //模拟耗时操作
                   for (int j = 0; j < 100000; j++) {
                       //...
                   }
                   System.out.println("这是第" + count + "个线程在执行任务----" + Thread.currentThread().getName());
               }
           });


       }
   }

从执行结果中可以看到,多出来的那11个任务被executor的调用者main主线程执行。
在这里插入图片描述

1.4、Discard策略

多余的任务被抛弃,不执行。

@Test
   public void testPolicy() {
       ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
               5,
               0,
               TimeUnit.MICROSECONDS,
               new ArrayBlockingQueue<Runnable>(5));
       //设置饱和策略为DiscardPolicy
       executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
       //测试
       for (int i = 1; i <= 11; i++) {

           int count = i;
           executor.execute(new Runnable() {
               @Override
               public void run() {
                   //模拟耗时操作
                   for (int j = 0; j < 100000; j++) {
                       //...
                   }
                   System.out.println("这是第" + count + "个线程在执行任务----" + Thread.currentThread().getName());
               }
           });


       }
   }

在这里插入图片描述

1.5、DiscardOldest策略

抛弃工作队列中的旧任务,然后尝试提交新任务执行。

@Test
   public void testPolicy() {
       ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
               5,
               0,
               TimeUnit.MICROSECONDS,
               new ArrayBlockingQueue<Runnable>(5));
       //设置饱和策略为DiscardOldestPolicy
       executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
       //测试
       for (int i = 1; i <= 11; i++) {

           int count = i;
           executor.execute(new Runnable() {
               @Override
               public void run() {
                   //模拟耗时操作
                   for (int j = 0; j < 100000; j++) {
                       //...
                   }
                   System.out.println("这是第" + count + "个线程在执行任务----" + Thread.currentThread().getName());
               }
           });


       }
   }

从执行结果可以看出,第11个任务被执行了,说明工作队列中的最旧任务被抛弃,执行了这个新的任务。
在这里插入图片描述

二、ThreadPoolExecutor的扩展方法

ThreadPoolExecutor在设计的时候就支持扩展其方法,主要为前处理beforeExecute、后处理afterExecute以及执行完毕处理terminated。

自定义的ThreadPoolExecutor:

public class MyThreadPoolExecutor extends ThreadPoolExecutor {
    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
    }

    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
    }

    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
    }


    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        super.beforeExecute(t, r);
        //before execute....
        System.out.println("before execute....");
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        //after execute....
        System.out.println("after execute....");
    }

    @Override
    protected void terminated() {
        super.terminated();
        //terminated
        System.out.println("terminated");
    }
}

在这里插入图片描述

源码篇:ThreadPoolExecutor 任务饱和策略验证 文章目录引言策略一:通知模式抛弃策略二:静音模式抛弃策略三:限制提交策略四:调用者执行 引言 使用java的任务管理框架的线程池执行任务时,线程池的任务等待队列被填满时,饱和策略开始发挥作用。ThreadPollExecutor的饱和策略通过setRejectedExecutionHandler来修改。JDK提供了4中饱和策略如下: 策略一:通知模式抛弃 AbortPolicy是默认的饱和策略,... 阅读详情

相关推荐

自适应滤波算法综述

自适应滤波算法综述

xdzhujy的博客 5万+

线程池饱和策略

线程池

Speaknow1989的博客 410

手把手教你用Foobar2000播放DSD音频(含DOP设置与SPDIF输出教程)

本文详细指导如何在Foobar2000中播放DSD音频,重点解析了DOP协议的原理与设置方法。通过安装SACD插件、配置输出设备及启用DOP模式,实现DSD音频的原生比特流输出,并特别讲解了如何通过SPDIF接口传输DSD信号,帮助发烧友充分释放高清音频设备的潜力。

weixin_29290963的博客 1833

【线程池】线程池的拒绝策略(饱和策略)

线程池拒绝策略(饱和策略)详解

小七的博客 2831

基于Multisim的智能交通灯控制系统仿真与实现(含动态闪烁功能)

本文详细介绍了基于Multisim的智能交通灯控制系统仿真与实现,重点解析了动态闪烁功能的电路设计。通过555定时器、74LS192计数器和JK触发器等核心模块,实现了主干道与支干道的交替通行及黄灯1Hz闪烁功能,为交通灯控制系统设计提供了完整的仿真方案。

weixin_29174013的博客 427

TMC5130/TMC5160步进电机驱动芯片深度解析与工程实践

步进电机驱动芯片是精密运动控制系统的物理执行核心,其性能直接决定定位精度、运行噪声与系统鲁棒性。基于电流闭环控制与电压前馈调制的混合驱动原理,现代智能驱动芯片如TMC51X0系列实现了微步插补、堵转检测和片上运动规划等关键技术突破。这类芯片通过SPI寄存器级配置实现StealthChop静音驱动与SpreadCycle高动态响应模式的无缝切换,在3D打印、CNC、机器人关节等场景中显著提升能效比与控制带宽。本文围绕TMC5130与TMC5160的硬件架构差异、寄存器操作时序、驱动模式物理机制及FreeRTO

weixin_35797963的博客 410

线程池的饱和策略有哪几个,分别做下说明

RejectedExecutionHandler处理器有4种饱和策略: 1)AbortPolicy:默认的饱和策略,直接抛出异常,阻止系统工作; 2)CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务,调用者线程性能可能急剧下降; 3)DiscardOldestPolicy:丢弃队列里最近的一个任务,执行当前任务; 4)DiscardPolicy:不做...

sinat_40880767的博客 2739

线性代数——(期末突击)行列式(上)-行列式计算、行列式的性质

简单解释一下:4213原本的顺序应为1234,对于‘4’而言,‘2’、‘1’、‘3’都应该排在它的前面,所以此处记逆序数为3;对于‘2’而言,‘1’应该排在它的前面,而‘3’排在它之后 是合理的,所以此处只有一个逆序数;最后看‘1’,其后面的‘3’排在后面显然也是合理的,故而4213的逆序数为4.一般我们使用这个性质来计算四阶行列式,也就是将其变换成三角行列式,再计算对角线的值;以主对角线为分界线的就为正三角,反之则为反三角行列式。若行列式某一行(列)为0,则该行列式=0.将和的那一行分开,其余行。

li13437542099的博客 1万+

线程池的饱和策略有哪些?

线程池的饱和策略是指当线程池中的任务队列已满时,线程池如何处理新提交的任务。

double222222的博客 983

使用Dify打造视频生成工作流:从提示词到视频的完整指南

Dify作为开源LLM应用开发平台,通过可视化工作流编排实现从文本到视频的端到端生成,将创意周期从天级缩短至分钟级。核心流程包括提示词工程、视频API调用、存储分发和结果反馈。

牛奶夹心巧克力 3437

GraphRAG 与 HippoRAG 深度对比:在 RAGFlow 中如何选择知识图谱方案?

本文深入对比了GraphRAG与HippoRAG在RAGFlow中的知识图谱构建方案,分析了两者在技术架构、资源消耗和场景适配性上的核心差异。GraphRAG适合需要快速响应和资源有限的场景,而HippoRAG则更适用于精确关系推理的专业领域。文章还提供了RAGFlow的演进路线和选型决策框架,帮助架构师根据实际需求做出合理选择。

weixin_27889245的博客 248

ThreadPoolExecutor饱和策略

饱和策略(Saturation Policy),也称为拒绝策略(Rejection Policy),是指当线程池中的线程数已达到最大值且任务队列已满时,如何处理新提交的任务。此时,线程池无法再接受新的任务,因此需要一种策略来决定如何处理这些任务。除了内置的几种饱和策略,Java 还允许开发者自定义接口来实现特定的饱和策略。@Override// 这里可以实现自定义的处理逻辑,如记录日志、重试任务等特点自定义饱和策略可以完全根据业务需求定制化,满足特殊的并发场景需求。

Flying_Fish_roe的博客 1532

【FF-A】第四章 Concepts

SPM的责任分为两个组件:SPM调度器(SPMD)和SPM核心(SPMC)。这两个组件都可以访问整个物理地址空间,并且是受信任的计算基础的一部分。当无需区分这两个组件时,术语SPM被使用。这些组件的责任如下所示。SPMD 位于 EL3 中,以 AArch64 或 AArch32 执行状态运行。SPMC 可以与 SPMD 共存在 EL3 中,也可以位于相邻的异常级别,即 S-EL1 或 S-EL2。SPM 在启动时初始化 EL3 LSP,并在运行时促进它们与其他端点之间的通信。

baron-周贺贺-代码改变世界ctw 1196

Java并发编程八股

本文整理了牛客上一个很详细的

m0_38132177的博客 274

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

线程池详解【ThreadPoolExecutor7个构造函数,四类线程池及饱和策略和使用场景】

jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。 1.初始化线程池(4种) 简介: Java线程池的工厂类:Executors类, 初始化4种类型的线程池: 1.newFixedThreadPool() 说明:初始化一个指定线程数的线程池,其中corePoolS...

Lj_18210158431的博客 1286

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ThreadPoolExecutor的饱和策略——线程池

线程池的四种饱和策略说明。

CrazyTiger的博客 1282

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java线程池饱和策略

最近在看 Java并发编程的艺术一书,第9章提到了线程池的实现原理,其中有这么一句话: 线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。那我们就来说说这个饱和策略是怎么一回事。 Java线程池会将提交的任务先置于工作队列中,在从工作队列中获取(阻塞队列直接由生产者提交给工作线程)。那么工作队列就有两种实现策略:无界

JoJo小风 4767

【编程底层思考】详述ThreadPoolExecutor线程池的所有参数及其含义,以及线程池在处理任务时的完整处理过程

在Java中,java.util.concurrent包提供了一套线程池执行器(Executor)的丰富实现,其中ThreadPoolExecutor是线程池的具体实现类。Executors类则是一个工厂类,用于方便地创建不同类型的线程池。

Dylaniou的博客 1703

[Java并发编程实战]线程池的饱和策略

有志者,事竟成。———《后汉书·耿弇传》 一个有志气的人,做事情是一定会成功的! 通常情况下,线程池会判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。但是如果有限队列已经满了,则会交给饱和策略来处理这个任务。 ThreadPoolExecutor 的饱和策略可以通过调用 setRejectedExecutionHandler 来修改。JDK 提供了...

seaicelin的博客 2109

Java并发编程学习17-线程池的使用(配置和扩展ThreadPoolExecutor)

本篇介绍线程池的使用中 配置线程池的内容,包含线程的创建与取消、管理队列任务、饱和策略,线程工厂等等

Huazie 1235

java线程池饱和策略_线程池、饱和策略详解

一、序言当我们需要使用线程的时候,我们可以新建一个线程,然后显式调用线程的start()方法,这样实现起来非常简便,但在某些场景下存在缺陷:如果需要同时执行多个任务(即并发的线程数量很多),频繁地创建线程会降低系统的效率,因为创建和销毁线程均需要一定的时间。线程池可以使线程得到复用,所谓线程复用就是线程在执行完一个任务后并不被销毁,该线程可以继续执行其他的任务。java.lang.concurre...

weixin_34324006的博客 1467

Java并发:线程池详解(ThreadPoolExecutor)

前言 现在在实现异步时,基本都是使用线程池来实现,线程池在工作应用的还是比较频繁的,本文将就线程池的使用、相关原理和主要方法源码进行深入讲解学习。 线程池的基本使用 package com.joonwhee.concurrent; import java.util.ArrayList; import java.util.List; import java.util.concurre...

程序员囧辉 1万+

Java并发编程之ThreadPoolExecutor

Java并发编程之ThreadPoolExecutor 引言: 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 简介: 多线程的程序的确能发挥多核处理器的性能。虽然与进程相比,线程轻量

zdl_csdn的博客 182

java线程池饱和策略_线程池的饱和策略-调用者执行 | 学步园

java并发编程实践阅读笔记之线程池的饱和策略使用java的任务管理框架的线程池执行任务时,线程池的任务等待队列被填满时,饱和策略开始发挥作用。ThreadPollExecutor的饱和策略通过setRejectedExecutionHandler来修改。JDK提供了4中饱和策略如下:AbortPolicy是默认的饱和策略,该策略会抛出未检查异常RejectedExecutionException...

weixin_39520210的博客 386

java中有界队列的饱和策略(reject policy)

文章目录AbortPolicyDiscardPolicyDiscardOldestPolicyCallerRunsPolicy使用Semaphore java中有界队列的饱和策略(reject policy) 我们在使用ExecutorService的时候知道,在ExecutorService中有个一个Queue来保存提交的任务,通过不同的构造函数,我们可以创建无界的队列(ExecutorServ...

程序那些事 1万+

ThreadPoolExecutor 饱和策略

对于ThreadPoolExecutor 饱和策略的解释可以参考以下文章:https://blog.youkuaiyun.com/w605283073/article/details/89930154

weixin_43312993的博客 452
上一篇: Java并发编程(6)-线程池总结
下一篇: Java并发编程(8)-Semaphore
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值