小记:executor.shutdownNow无法关闭线程池,线程池卡死

正确理解ExecutorService.shutdown()的优雅关闭行为 在Java并发编程中,Future接口是用于表示异步计算的结果的一种方式。它使得我们可以提交一个任务到线程池中执行,并在稍后获得任务的执行结果,而不需要阻塞当前线程等待结果的返回。Future接口包含以下几个核心方法:get():等待计算完成,并获取结果。如果任务还没有完成,则当前线程会一直等待,直到任务执行完毕。:与get()类似,但增加了超时设置,超时则抛出。:取消任务的执行。如果任务已经开始执行,根据参数决定是否中断正在执行的线程。isDone() 阅读详情

在子线程中出现没有明确退出条件,或者需要在发出中断信号后及时结束的逻辑中,一定要手动检测线程结束标志位

正确案例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Demo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(new SubThread());
        executorService.submit(new SubThread());
        executorService.shutdown();
        try {
            if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
                System.out.println("线程池关闭超时");
                // 触发强制关闭,将 标志位 置为 interrupted
                executorService.shutdownNow();
                if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) {
                    System.out.println("线程池强制关闭失败");
                } else {
                    System.out.println("线程池强制关闭成功");
                }
            } else {
                System.out.println("线程池关闭成功");
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
class SubThread implements Runnable {
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

错误案例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Demo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(new SubThread());
        executorService.submit(new SubThread());
        executorService.shutdown();
        try {
            if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
                System.out.println("线程池关闭超时");
                executorService.shutdownNow();
                if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) {
                    System.out.println("线程池强制关闭失败");
                } else {
                    System.out.println("线程池强制关闭成功");
                }
            } else {
                System.out.println("线程池关闭成功");
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
class SubThread implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
HID报告描述符实战解析:从Usage到Item的完整设计流程 本文深入解析了HID报告描述符的设计流程,从核心概念Usage(用途定义)入手,详细阐述了如何通过Item(条目)的三种角色——全局、局部与主干,构建出能被系统正确识别的设备“说明书”。文章以标准USB鼠标和键盘为例进行实战拆解,并介绍了使用Report ID与自定义设备等进阶设计方法,帮助开发者掌握这一实现USB设备即插即用的关键技术。 阅读详情

相关推荐

fMRI独立成分分析方法(ICA)工具GIFT

详细介绍了进行fmri数据进行ICA分析的工具包GIFT的使用,和进行ICA分析的流程。

m0_58256026的博客 1万+

Java线程池的shutdownnow()方法为什么不能停止运行的任务?

Java线程池的shutdownnow()方法为什么不能停止运行的任务? ​在工作中到了一个实际问题,明明已经调用了线程池的shutdownnow()方法,但是线程池中任务依然在继续运行。 ​加下来先大概介绍一下问题背景,然后给出原因分析,最后给出这个问题的解决办法。 一、问题背景 ​事情是这样的,在一个线程池中运行着一个周期任务task,这个task的run方法中会执行四个子任务,每个子任务中都会有网络操作。 ​ 下面简单用代码进行展示一下。 public class Task implements R

一直在努力的小渣渣 5529

CMOS sensor 基础

NA

m0_72053187的博客 1657

6.4 ThreadPoolExecutor线程池的关闭方法shutdown和shutdownNow区别、示例

shutdown(): 把线程池的状态设置成SHUTDOWN状态,然后中断所有没有正执行任务的线程 shutdownNow(): 首先把线程池的状态设置成STOP,然后尝试停止所有正在执行任务或者暂停任务的线程,并返回等待执行任务的列表 常用 通常我们调用shutdown()方法关闭线程池,如果不需要任务执行完成,可以调用shutdownNow() 原理 遍历线程池中的工作线程,然后组个调用线程的interrupt方法来中断线程,所以无法响应中断任务的可能永远无法停止 其他方法 isShu

一点光辉的博客 1万+

硬件原理图分析

文章目录1 硬件原理图分析1.1 MCU部分1.2 NB部分1.3 电源部分 1 硬件原理图分析 1.1 MCU部分 MCU接口部分没啥需要注意,都是常规操作。 1.2 NB部分 U4是用来防静电的。 由于NB的以上几个引脚只支持1.8V,所以这里需要3.3V转1.8V的电路。只要把握住谁改变电平就好分析是怎么实现电平转换的了。 1.3 电源部分 图中的MOS是用来实现USB和电池同时插入时只能USB供电功能的。 ...

木子皿--啥都不会的菜鸟 8170

excel 利用SUBTOTAL函数计算筛选后数列总和、均值、最大、最小值

表里有三个人,咱们需要筛选出三个人,并分别计算他们的总和值。 先看一下数据范围(A1:B27) 通过筛选找张三。 按照上图所示输入函数,选择9,求和。 然后按照函数输入即可。 就能计算出结果。 筛选项选择王五,就会自动计算王五的总和。 筛选到李四就会自动计算李四的总和。 如果把9改成1,就是自动计算筛选出来的均值结果,如下图所示。 如果改成4就是取筛选项的最大值,选择5就是取最小值。 ...

yuanYW7556的博客 3万+

Executor - Shutdown、ShutdownNow、awaitTermination 详解与实战

Executor - Shutdown、ShutdownNow、awaitTermination 详解与实战

BITDDD小栈 5417

说说通用报表控件

我们已经开发有2款WINCC报表控件,一种是固定模板,一种是自定义模板。但是它们有个共同特点,就是数据都是来自WINCC的归档数据库。使用WINCC归档数据库的好处是不需要自己写脚本保存数据。但是有些情况下,我们需要自己保存数据,或者第三方系统通过数据表的方式给我们提供数据。那这样的话,我们之前的两款控件就不支持了。正好有个客户有类似需要,于是加了一天班写了个通用报表控件。之所以说是通用,是因为它可以插入任何支持.NET控件的组态软件中,比如WINCC、IFIX等。并且它不依赖于组态软件自己...

HwLib_的博客 3550

ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 的区别及使用

但是一个 app 总有结束的时刻,当 app 结束时,ExecutorService 却并不会终止,它将导致 JVM 继续存活并运行。所以,shutdownNow() 并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。如果你的 app 需要随时响应处理新提交的任务,那。是阻塞的,返回结果是线程池是否已停止(true/false);2. 已经提交的任务(包括正在跑的和队列中等待的),会继续执行完成;方法来实现的,这种方法的作用有限,如果线程中没有。

justlpf的专栏 2538

C#解析基恩士(KEYENCE)PLC数据:KV协议通信与实时监控实现

KV协议是基恩士PLC使用的一种专用通信协议,通常用于与上位机进行数据交换。KV协议通过RS-232C、RS-485、Ethernet等接口与上位机通信,支持多种数据类型的读写,包括但不限于位、字、双字、浮点数等。简洁易用:KV协议的通信格式简单,易于实现。支持多种数据类型:支持位数据、字数据、定长字符串等。高效实时性:能够提供较高的实时数据交换性能,适合实时监控应用。本文介绍了如何通过C#与基恩士KV系列PLC进行通信,实现数据的解析和实时监控功能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1806

8、Windows 部署ollama

一个本地运行大模型的集成框架,目前主要针对主流的LLaMA架构的开源大模型设计,通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中,从而实现大模型的下载、启动和本地运行的自动化部署及推理流程。此外,Ollama内置了一系列针对大模型运行和推理的优化策略,目前作为一个非常热门的大模型托管平台,已被包括LangChain、Taskweaver等在内的多个热门项目高度集成。

Andy_shenzl的博客 1131

[翻译][Java]ExecutorService的正确关闭方法

q ---------------------------------------------------------------------------------------------

枣子的IT专栏 3万+

qt open3dBPA重建

open3d BPA重建

阁楼 516

ThreadPoolExecutor 中的 shutdown() 、shutdownNow() 、awaitTermination() 的用法和区别

在使用线程池的时候,ExecutorService提供了两种关闭线程池的方法,shutdown()和shutdownNow(),先不墨迹,直接写出这两个方法的作用: 使用shutdown正常关闭 将线程池状态置为SHUTDOWN,线程池并不会立即停止: 停止接收外部submit的任务 内部正在跑的任务和队列里等待的任务,会执行完 等到第二步完成后,才真正停止 使用shutdownNow强行关闭 将线程池状态置为STOP。企图立即停止,事实上不一定: 跟shutdown()一样,先停止接收外部提交的

及时雨的csdn 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ExecutorService中shutdown()、shutdownNow()、awaitTermination()的使用及区别

使用ExecutorService类时,经常用到shutdown()、shutdownNow()、awaitTermination()方法, 它们怎么使用,有什么区别呢? 下面我们来说说。 一、方法说明 1、shutdown():将线程池状态置为 shutdown ,并不会立即停止 英文原意:关闭,倒闭;停工。 这里的意思是 关闭线程池。与使用数据库连接池一样,每次使用完毕后,都要关闭线程...

yamaxifeng_132的专栏 968

深度学习工具包 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")

ExecutorService的shutdownNow方法注意事项

当通过shutdownNow来强行关闭ExecutorService时,它会尝试取消正在执行的任务并返回所有已提交但尚未开始的任务;注意:调用shutdownNow在关闭过程中只会返回尚未开始的任务,而不会返回正在执行的任务。然而,我们无法通过常规方法来找出哪些任务已经开始但尚未结束。这意味着我们无法在关闭过程中知道正在执行的任务的状态,除非任务本身会执行某种检查。 public class

风雨诗轩的博客 2703

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

线程池没有关闭造成主线程没有退出问题

停止线程池的方法有两种一种是 1、shutdown()方法 方法定义:public void shutdown() (1)线程池的状态变成SHUTDOWN状态,此时不能再往线程池中添加新的任务,否则会抛出RejectedExecutionException异常。 (2)线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。 注意这个函数不会等待提交的任务执行完成,要想等...

dream_xz的博客 3689

threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别

最近在看并发编程,在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown()、shutdownNow()、awaitTermination())产生了兴趣,同时又感到迷惑。查了些资料,自己写了测试代码,总算有了个比较清晰的认识。下面一

Cuber_Q's blogs 5万+

shutdownNow关不掉线程

@Override public void run() { try { while (!Thread.interrupted()) { while (!car.waxOn) { car.waxOn(); } } } catch (InterruptedException e)

Jason的博客 3957

shutdownNow的原理及不生效的原因

shutdownNow的原理及不生效的原因 CC.getCachedThreadPool().execute(() -> { try { for (int i = 0; i < 100000000; i++) { System.out.println("---------U线程运行中---------" + i); Thread.sleep(100...

m0_46582888的博客 1440

ThreadPoolExecutor源码解读(三)——如何优雅的关闭线程池(shutdown、shutdownNow、awaitTermination)

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!大家看完有什么不懂的可以在下方留言讨论也可以关注。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例[外链图片转存中…(img-0jZRIYvh-1711863103041)]

erghtt的博客 1258

ThreadPoolExecutor线程池,shutdown和shutdownNow关闭线程池方式对比,以及确保线程池能够彻底关闭的一种方式

1. ThreadPoolExecutor线程池 1.1 创建线程池,构造方法的几个参数说明及创建如下。 1.2 shutdown方式关闭线程池 a. 空闲且能interrupt表示该线程处于阻塞等待状态,不包括工作中的阻塞状态,比如Thread.sleep()就不包括;b. 当前正在工作的,会在后期获取任务时根据线程池的状态调用processWorkerExit方法销毁线程。 1.3 shutdownNow方式强制关闭线程池 所有可被interrupt的线程既包括空闲处于阻塞..

走过路过不要错过 2709

关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用?

ExecutorService 接口提供了三个方法用于手动关闭线程池,分别是shutdown(),shutdownNow()和awaitTermination()。我们最经常使用的 ThreadPoolExecutor 正是 ExecutorService 的实现类,自然也实现了这些方法。相信有很多小伙伴都没搞明白这些方法的区别,也不清楚在不同的情况下应该使用哪个方法。本文将通过ThreadPoo...

IamHYN的博客 3443

Java 线程池主线程等待子线程awaitTermination方法使用详解

Java中在使用Executors线程池时,有时场景需要主线程等各子线程都运行完毕后再执行。这时候就需要用到ExecutorService接口中的awaitTermination方法,我们来看看源码中对该方法的说明: 大概意思是这样的:该方法调用会被阻塞,并且在以下几种情况任意一种发生时都会导致该方法的执行:即shutdown方法被调用之后,或者参数中定义的timeout时间到达或者...

风 1921

ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 含义和区别

一、方法说明 1、shutdown():将线程池状态置为 shutdown ,并不会立即停止 英文原意:关闭,倒闭;停工 1、停止接收新的submit的任务; 2、已经提交的任务(包括正在跑的和队列中等待的),会继续执行完成; 3、等到第2步完成后,才真正停止; 2、shutdownNow():将线程池状态置为stop,企图立即停止,事实上不一定 1、跟 shutdown...

猎人在吃肉 4万+

ThreadPoolExecutor关闭机制:shutdown与shutdownNow

ThreadPoolExecutor关闭机制解析:优雅与强制的艺术 本文深度剖析了ThreadPoolExecutor的两种关闭机制。shutdown()实现优雅关闭,通过状态转换至SHUTDOWN,仅中断空闲线程,确保已提交任务完成;而shutdownNow()则强制终止,立即转入STOP状态,中断所有线程并返回未执行任务队列。文章详细对比了两者的核心差异、状态流转及适用场景,并给出最佳实践:数据敏感场景使用shutdown()配合awaitTermination(),紧急情况下采用shutdownNow

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 1619
上一篇: 小记java正则表达式中matcher.find() 和 matcher.matches() 的区别
下一篇: 记一次使用Future+ThreadPool的多线程卡死问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值