java多线程初探(四)取消和关闭

从手机到单片机:聊聊ARM Cortex家族那些事,A、R、M系列到底有啥不同? 本文深入解析ARM Cortex家族的A、R、M三大系列处理器,揭示它们在性能、实时响应和能效方面的核心差异。从智能手机到汽车电子和物联网设备,Cortex-A、R、M各司其职,分别应对复杂运算、实时控制和超低功耗场景。通过技术指标对比和典型应用案例,帮助开发者理解如何根据DMIPS/MHz等关键参数选择适合的处理器架构。 阅读详情

任务启动很容易,一般会让它们运行直到结束,但有时需要提前结束,或快速关闭,java没有直接提供任何机制来安全终止线程,而是补偿性提供了中断(Interruption),这是一种协作机制。

取消

场景:用户请求取消;有时间限制的操作;应用程序事件(如分解并搜索,其中一个任务搜索得到结果后,其它任务提前结束);错误(例如,爬虫时硬盘装满)

协作机制示例,设置“已请求取消”标志

package gcc.thread.test;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by gcc on 2018/4/9.
 * 一个不断给集合添加质数的操作
 */
public class ThreadCancel implements Runnable {

    //质数集合
    private static List<BigInteger> primes = new LinkedList<BigInteger>();

    //加volatile,防止指令重排序而导致的cancelled读取偏后,不准确,默认false
    private volatile boolean cancelled=false;

    public void run() {
        BigInteger bigInteger = BigInteger.ONE;//初始化1
        while (!cancelled){
            bigInteger = bigInteger.nextProbablePrime();//返回一个整数大于该BigInteger的素数
            synchronized (this){
                primes.add(bigInteger);
            }
        }
    }

    public void changeCancelled(){
        cancelled=true;
    }

    public synchronized List<BigInteger> get(){
        return new ArrayList<BigInteger>(primes);
    }

    List<BigInteger> aSecondOfPrimes() throws InterruptedException{
        ThreadCancel threadCancel = new ThreadCancel();
        new Thread(threadCancel).start();
        try {
            TimeUnit.SECONDS.sleep(1);//设置休眠时间是一秒,比传统的Thread.sleep(1*1000);写法更优雅,性能基本不受影响
        } finally {
            threadCancel.changeCancelled();
        }
        return threadCancel.get();
    }

}
package gcc.thread.test;

import java.math.BigInteger;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by gcc on 2018/4/9.
 * 一个不断给集合添加质数的操作
 */
public class ThreadCancelMain {

    public static void main(String[] args) throws InterruptedException {
        ThreadCancel threadCancel = new ThreadCancel();
        threadCancel.aSecondOfPrimes();
        System.out.println(threadCancel.aSecondOfPrimes().size());
    }

}

示例将一个质数生成器在一秒后取消,通常不会刚好一秒时取消,因为在取消和执行下一次循环之间会有延迟。

可能结果如下:


一个可取消的任务,必须有取消策略,这个策略要详细的定义取消操作的“How”,“When”,“What”,即怎么取消,何时取消,取消操作时执行什么。

问题:取消可能失败,导致永远运行,例如:将上例的primes集合改为BlockingQueue<BigInteger> queue,在while循环里用queue.put(bigInteger)去放对象,如果生产速度大于消费速度,put方法就会堵塞(无法执行),“以请求取消”标志将无法修改而失效。

中断

这是书本截图说明:


因为阻塞而无法取消时,中断成了解决问题的一种途径。

中断并不是立刻中断一个正在运行的线程,而是发出中断请求,在合适的时间中断(这个时间也叫取消点),例如sleep就会严格处理中断请求,会抛出InterruptedException,然后结束sleep()方法。

场景:很多问题永远无法解决(比如枚举所有质素),或者需要过长的时间解决,这样的情况下,指定“在十分钟内枚举质数”,那么会非常有用,这里使用Future来实现这样的效果,如图:


RU.EXE实用指南:从基础操作到高级调试技巧 本文是RU.EXE(RW Everything)的实用指南,详细介绍了这款硬件调试工具从基础操作到高级技巧的全过程。文章阐述了RU.EXE作为直接读写硬件寄存器、内存和PCI配置空间的强大工具,如何帮助硬件工程师和开发人员高效进行底层系统调试与故障排查,并强调了安全操作的重要性。 阅读详情

相关推荐

三维Copula建模进阶:从对称、嵌套到Pair-Copula(C-Vine/D-Vine)到底怎么选?

本文深入探讨三维Copula建模的进阶策略,包括对称Archimedean、嵌套结构和Vine Copula(C-Vine/D-Vine)的选择方法。通过对比数学特性、计算复杂度和实际应用案例,提供了一套针对金融风险分析等场景的决策框架,帮助分析师根据数据特征选择最优模型。

weixin_27038701的博客 436

Java终止线程的三种方式

线程

爱写bug的王六六 7851

从‘平行’到‘鱼骨’:手把手拆解AlGaN/GaN HEMT多栅指结构的布局优化实战

本文深入探讨了AlGaN/GaN HEMT多栅指结构的布局优化,从传统的平行栅结构到创新的鱼骨栅结构,详细解析了如何通过优化信号路径和热管理提升功率器件的性能。文章结合实测数据和EDA工具,展示了鱼骨栅结构在相位一致性、热阻和版图利用率方面的显著改进,为射频功率放大器设计提供了实用指导。

weixin_27061475的博客 442

如何终止java线程

终止线程的三种方法      有三种方法可以使终止线程。      1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。      2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。      3.  使用interrupt方法中断线程。  1. 使用退出标志终止线程 

anhuidelinger的专栏 18万+

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计提示:本文采用PHP对数据库进行操作:本文就介绍了PHP实现对MySQL数据库的增删改查操作基础内容。

900

AgentScope实战训练营:从零搭建一个完整的A2A Agent应用

2024年4月,Google在Google Cloud Next大会上正式提出了A2A(Agent-to-Agent)协议,这是一个开放协议,旨在让不同的AI Agent之间能够像微服务一样相互发现、相互调用。通俗地讲:A2A协议就是AI Agent世界的HTTP协议——有了它,一个Agent可以把自己的能力以标准化的方式暴露出去,另一个Agent可以无缝地发现并调用它。本文将基于阿里巴巴开源的(Apache 2.0协议),手把手带你从零搭建一个完整的A2A Agent应用。

program哲学 564

java中thread执行任务取消

Futrue.cancel()举例 在执行一些耗时较长的逻辑时,经常会通过创建新线程异步处理来减少程序响应时间,但一些特殊场景下由于种种原因,用户希望能够取消本次提交的任务。这里使用thread的interrupt方法配合一些具体业务代码,来实现取消任务的功能。 先看如下代码,通过ExecutorService和Callable处理任务提交 @Slf4j @Service public c...

jwq201288888888的专栏 999

大模型新闻摘要生成质量评估工具

大模型新闻摘要生成质量评估工具 关键词:大模型、新闻摘要、质量评估、自然语言处理、算法 摘要:本文将探讨大模型新闻摘要生成质量评估工具的设计与应用。首先介绍大模型新闻摘要生成的背景和问题,然后深入分析质量评估的难点和重要性,接着介绍大模型的

AI天才研究院 828

Java 终止线程的几种方式

一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。他们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。我们可以直接使用thread.stop()来强行终止线程,但是stop()方法是很危险的,就想突然关闭电源一样。所谓正常运行结束,就是程序正常运行结束,线程自动结束。

书香水墨 9480

Cartographer实现双雷达建图

TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 2 --执行一次前端匹配需要的激光扫描分段数量。关于num_subdivisions_per_laser_scan。num_laser_scans =2,--订阅激光扫描话题数量。Frame改为 前雷达laser_1 后雷达laser_2。雷达的话题由scan改为,前scan_1 后scan_2。有些人说需要改成2,但我这里改成2反而不行,1才可以。

Studying…… 1261

ABAP 7.40 新语法介绍系列之二 - ABAP 类型转换操作符 CONV

这个lv_input_s变量的唯一使命,就是接收来自 char10 类型的 lv_input_c 变量的值,然后传递到 print 方法里去。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1419

Java多线程---线程的取消和关闭

目录取消标志中断中断机制中断机制的正确理解如何响应中断总结 启动一个线程是很容易的,无论是继承Thread类或者实现Runnable方法。大多数时候我们都是希望它能正常运行直到结束,或者自行停止。然而有时候我们希望能够提前结束线程,这个可能是用户取消了某个操作,或者应用程序需要快速关闭。 Java语言本身没有提供任何机制来安全的终结某个线程。但是提供了中断(Interruption),这是一种协作...

machine_Heaven的博客 1621

最全面的行人重识别数据集汇总

汇总了一些REID的数据集,几乎涵盖了所有的数据集。如果有缺少的欢迎留言补充。我将能下载到的数据集放在了网盘里,链接如下:链接:https://pan.baidu.com/s/1hQ4PKvtAhAvoZiXbcIu93w 提取码:o3iyQMUL iLIDS基于iLIDS MCTS的数据集,是一个在机场繁忙时候通过监控系统中多个摄像头收集到的数据集。几乎每个ID(identity)都有从两个无重叠(区域)的摄像头拍摄的四幅图像。该数据集具有严重遮挡和姿势差异的场景。

m0_47867638的博客 1万+

java多线程并发之旅-31-任务的关闭与取消

java 对于终止线程的考虑 Java没有提供任何机制来安全地(抢占式方法)终止线程, 虽然Thread.stop和suspend等方法提供了这样的机制,但是由于存在着一些严重的缺陷,因此应该避免使用。 但它提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。 一、取消 取消操作的原因 用户请求取消 有时间限制的操作 应用程序事件 错误...

1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAVA并发编程(四)任务的取消与关闭

使用简单标志位保存取消状态 为了保证标志位可靠,标志必须为volatile类型。 使用标志位来取消任务是不及时的,如果中间调用了阻塞方法,有可能永远都无法结束。 每个线程都有一个boolean类型的中断状态,interrupt方法能中断目标线程,而isInterrupted方法能返回目标线程的中断状态,静态的interrupted方法将清除当前线程的中断状态,也是清除中断状态的唯一一个方法。 在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的

robert的专栏 7343

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

java多线程中的“任务取消“

在使用 java 进行多线程开发时,任务和线程的启动很容易.大多数时候我们都会让它们运行直到结束,或者让它们自行停止.然而,有时候我们希望能提前结束任务或线程,或许时因为用户取消了操作,或者应用程序需要被快速关闭.要使任务和线程能够安全/快速/可靠的停止下来,并不是意见容易的事.java 没有提供任何机制来安全的终止线程但是 java 提供了中断(interruption),这是一种协作机制,能够使一个线程终止另一个线程的当前工作.这种协作式的方法时必要的,我们很少希望某个任务/线程或服务立即停止,伊娃内这

qq_43022896的博客 1777

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

线程的取消和关闭

随着多线程技术的发展和普及,越来越多的并发程序被开发出来并投入生产。编写正确的程序很难,而编写正确的并发程序则是难上加难。在无数开发者的不懈努力下,并发程序的实现复杂度已经大大降低了。如...

Miracle 521

java线程的取消与关闭

要启动一个Java线程是一件及愉快又轻松的事,只要start就行了。但是如果想要在线程未运行完毕的情况下取消线程的运行却不是一件容易的事。               虽然Thread类提供了两个方法用于线程的停止(sopt)与挂起(suspend),但是在JDK中已经都@Deprecated了,所以作为开发者是不能使用这两个方法来终止线程的。        那么在JAVA中该如何快

wuyupengwoaini的专栏 1万+

Java多线程——任务执行和取消

Executor基于生产者—消费者模式,用Runnable表示任务,提交任务操作相当于生产者,执行任务的线程相当于消费者。

松仔Log的博客 963

《Java并发编程实战》 任务执行和取消关闭

http://blog.youkuaiyun.com/androiddevelop/article/details/27299357   Java没有提供任何机制来安全地(抢占式方法)终止线程,虽然Thread.stop和suspend等方法提供了这样的机制,但是由于存在着一些严重的缺陷,因此应该避免使用。但它提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工

清文的博客 2525

从零开始学多线程之取消和关闭(六)

小节 为什么需要取消和关闭: 有时候我们希望在任务或线程自然结束之前就停止它们,可能因为用户取消了操作,或者应用程序需要快速关闭. 取消和关闭的好处: 不会浪费资源执行一些没用的操作、保证程序的正常退出. Java没有提供任何机制,来安全地强迫线程停止手头的工作.它提供中断(线程的interrupt方法)--- 一个协作机制,使一个线程能够要求另一个线程停止当前的工作. 立即停止线程的坏处:这种协...

ahilll的博客 694

java 关闭按取消也关闭_java线程的取消与关闭

要启动一个Java线程是一件及愉快又轻松的事,只要start就行了。但是如果想要在线程未运行完毕的情况下取消线程的运行却不是一件容易的事虽然Thread类提供了两个方法用于线程的停止(sopt)与挂起(suspend),但是在JDK中已经都@Deprecated了,所以作为开发者是不能使用这两个方法来终止线程的。那么在JAVA中该如何快速,安全,可靠地终止一个线程呢?法宝只有一个:中断。首先我们先...

weixin_33754744的博客 278

第七章 取消和关闭

目录一 任务取消1.1 中断核心1.2 线程中断策略1.3 响应中断1.4 计时运行1.5 通过Future来实现取消1.7 处理不可中断的我阻塞 java没有提供任何机制来安全地终止线程,但他提供了中断,这是一种协作机制。 因为直接中断线程是一个非常危险的操作,所以通过中断机制;让任务自己来响应中断、结束工作是一种更加安全的方式。 生命周期结束的问题非常复杂,但却很重要 一 任务取消 java没...

codezhuyc的博客 221

java 关闭多线程_《Java并发编程》之五:取消和关闭线程

Java没有提供任何机制来安全地终止线程,虽然Thread.stop和suspend等方法提供了这样的机制,但是存在严重的缺陷,应该避免使用这些方法。但是Java提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。这种协作方式是必要的,我们很少希望某个任务线程或者服务立即停止,因为这种立即停止会时某个共享的数据结构处于不一致的状态。相反,在编写任务和服...

weixin_34478373的博客 503

java并发编程(七)线程的取消与关闭

中断 要使任务和线程安全、快速、可靠的停止下来并不是一件容易的事情。java没有提供任何机制来安全的终止线程。 但它提供了中断(Interruption),这是一种协作机制能够使一个线程终止另一个线程的当前工作。 通常,中断是实现取消的最合理方式。 中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。有些方法,例如 Thread.sleep(),wait,jion很认真地对待这样的...

小生的博客 351

Java 多线程 - 线程的取消与关闭

Java没有一种安全的抢占式方法来停止线程,只有一些协作式机制。其中一种协作机制能设置某个“已请求取消”标志,而任务将定期查看该标志。如果设置了这个标志,那么任务将提前结束。举例如下: [java] view plaincopyprint? public class PrimeGenerator implements Runnable {  

junjianzhang的专栏 2487
上一篇: 阿里云centos7.2部署笔录--安装tomcat8(四)
下一篇: java8部分特性记录
gcc_front
博客等级 码龄9年 16粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值