java 线程强制停止线程_java多线程之停止线程

在多线程开发中停止线程是非常重要的技术点。

停止线程在Java语言中并不像break语句那样干脆。须要一些技巧性的处理。

一、  异常法

採用异常法来停止一个线程。首先我们须要了解一下两个方法的使用方法:

1、interrupt()方法

public class MyThread extends Thread{

@Override

public void run() {

for (int i = 1; i <= 10000; i++) {

System.out.println("i="+i);

}

}

public static void main(String[] args)throws Exception {

MyThread thread=new MyThread();

thread.start();

thread.sleep(10);

thread.interrupt();

}

}

上面的样例调用interrupt()方法来停止线程,但interrupt()方法的使用效果并不像for+break语句那样。立即就能停止循环。

调用interrupt()方法不过在当前线程打了一个停止的标记,并非真的停止。那么假设停止线程了?我们接着往以下看。

2、推断线程是否是停止状态

1)、  interrupted()

public class MyThread extends Thread{

@Override

public void run() {

for (int i = 1; i <= 10000; i++) {

System.out.println("i="+i);

}

}

public static void main(String[] args)throws Exception {

try{

MyThread thread=new MyThread();

thread.start();

thread.sleep(100);

thread.interrupt();

System.out.println("线程停止了吗1?--->"+thread.interrupted());

System.out.println("线程停止了吗2?--->"+thread.interrupted());

}catch(Exception e){

e.printStackTrace();

}

System.out.println("end");

}

}Center

从控制台打印的结果来看,线程没有停止。这就是说,interrupted()測试当前线程是否中断,由于这个当前线程就是main。它没有中断过,所以打印的结果是两个false。

怎样使main线程产生中断效果了。我们在看下,以下的样例:

public class MyThread{

public static void main(String[] args){

Thread.currentThread().interrupt();

System.out.println("线程停止了吗1?---->"+Thread.interrupted());

System.out.println("线程停止了吗2?---->"+Thread.interrupted());

System.out.println("end");

}

}

Center

从上面的结果来看。interrupted()方法的确推断当前线程是否是停止状态。

可是为什么第2个值是false。原来。连续两次调用该方法第一次会清除中断状态后。第二次调用所以返回flase。

2)、  isInterrupted()

public class MyThread extends Thread{

@Override

public void run() {

for (int i = 1; i <= 10000; i++) {

System.out.println("i="+i);

}

}

public static void main(String[] args){

try{

MyThread thread=new MyThread();

thread.start();

thread.sleep(10);

thread.interrupt();

System.out.println("线程停止了吗1?--->"+thread.isInterrupted());

System.out.println("线程停止了吗2?--->"+thread.isInterrupted());

}catch(Exception e){

e.printStackTrace();

}

System.out.println("end");

}

}

d4f30196061860304a52c014280a61c4.png

从结果看出方法isInterrupted()并未清除,所以打印出了两个true.

3、停止线程

public class MyThread extends Thread{

@Override

public void run() {

for (int i = 1; i <= 10000; i++) {

if(this.interrupted()){

System.out.println("线程是停止状态了,我要退出了.");

break;

}

System.out.println("i="+i);

}

System.out.println("假设此处还是循环,那么我就会继续运行.线程并没有停止");

}

public static void main(String[] args){

try{

MyThread thread=new MyThread();

thread.start();

thread.sleep(10);

thread.interrupt();

System.out.println("end");

}catch(Exception e){

e.printStackTrace();

}

}

}

98047217b6111a28d0fc5c7b7ef7c35f.png

假设这么写的话,线程并没有停止。如今我们在改动下代码。也就是所谓的异常法停止线程。

public class MyThread extends Thread{

@Override

public void run() {

try{

for (int i = 1; i <= 10000; i++) {

if(this.interrupted()){

System.out.println("线程是停止状态了,我要退出了.");

throw new InterruptedException();

}

System.out.println("i="+i);

}

System.out.println("我被运行了吗?");

}catch(InterruptedException e){

System.out.println("---这次线程停了---");

e.printStackTrace();

}

}

public static void main(String[] args){

try{

MyThread thread=new MyThread();

thread.start();

thread.sleep(10);

thread.interrupt();

System.out.println("end");

}catch(Exception e){

e.printStackTrace();

}

}

}

947f4bca2fe3b9c19b72ed95433dfb1d.png

二、  在沉睡中停止

假设线程在sleep()状态下停止线程会有什么效果了?

public class MyThread extends Thread{

@Override

public void run() {

try{

System.out.println("run start");

Thread.sleep(1000000);

System.out.println("run end");

}catch(InterruptedException e){

System.out.println("sleep被停止,状态:--->"+this.isInterrupted());

e.printStackTrace();

}

}

public static void main(String[] args){

try{

MyThread thread=new MyThread();

thread.start();

thread.interrupt();

thread.sleep(1000);

}catch(Exception e){

System.out.println("main catch");

e.printStackTrace();

}

}

}

d5f53bf053d3fe29525e16944c0f1c28.png

从结果我们能够看出,在线程睡眠时候停止某一线程,会异常。而且清除停止状态。我们前面异常停止线程,都是先睡眠,在停止线程,与之相反的操作,我写代码的时候须要注意下。

public class MyThread extends Thread{

@Override

public void run() {

try{

for (int i = 1; i <= 10000; i++) {

System.out.println("i="+i);

}

System.out.println("run start");

Thread.sleep(1000000);

System.out.println("run end");

}catch(InterruptedException e){

System.out.println("线程被停止了。在sleep,状态:--->"+this.isInterrupted());

e.printStackTrace();

}

}

public static void main(String[] args){

try{

MyThread thread=new MyThread();

thread.start();

thread.interrupt();

}catch(Exception e){

System.out.println("main catch");

e.printStackTrace();

}

}

}

98fc0760bc6b04bc9a2ac133a0f2bd00.png

三、  暴力停止

public class MyThread extends Thread{

private int i=0;

@Override

public void run() {

try{

while (true) {

i++;

System.out.println("i="+i);

Thread.sleep(1000);

}

}catch(Exception e){

e.printStackTrace();

}

}

public static void main(String[] args){

try{

MyThread thread=new MyThread();

thread.start();

Thread.sleep(6000);

thread.stop();

}catch(Exception e){

e.printStackTrace();

}

}

}

Center

stop()方法已经被弃用,假设强制让线程停止。能够会有一些清理工作没得到完毕。还有就是对锁定的对象进行了解锁,导致数据不同步的现象,所以开发时候禁止使用该方法去暴力停止线程。

四、  使用return停止线程

public class MyThread extends Thread{

private int i=0;

@Override

public void run() {

try{

while (true) {

i++;

if(this.interrupted()){

System.out.println("线程停止了");

return;

}

System.out.println("i="+i);

}

}catch(Exception e){

e.printStackTrace();

}

}

public static void main(String[] args){

try{

MyThread thread=new MyThread();

thread.start();

Thread.sleep(2000);

thread.interrupt();

}catch(Exception e){

e.printStackTrace();

}

}

}

c4a5b674ea6edbbd22f2ad3a43d6eca0.png

PS:只是还是建议使用异常法来停止线程,由于在catch块中还能够将异常向上抛,使线程停止事件得到传播。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双系统Ubuntu分区扩容过程记录

本人电脑上安装了Win10 Ubuntu 12.04双系统。前段时间因为在Ubuntu上做项目要安装一个比较大的软件&#xff0c;导致Ubuntu根分区的空间不够了。于是&#xff0c;从硬盘又分出来一部分空间&#xff0c;分给Ubuntu。于是有了这篇Ubuntu扩容过程记录&#xff0c;也可以当作是一篇…

安装JAVA8要登录_JDK8的安装及环境配置

原文链接:https://www.cnblogs.com/chenxj/p/10137221.html1、下载JDK&#xff1b;b、或百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1S14y4_3eN9G6oOVfhmbe_w提取码&#xff1a;0cf62、双击安装程序&#xff0c;点击下一步安装目录若不修改&#xff0c;可直…

早期访问中带有NetBeans的Oracle公共云Java服务

谁期望发生这种情况&#xff1a;Oracle正在开发公共云产品&#xff0c;并且即将开始正式启动的迹象已经出现。 在正式宣布之后将近一年&#xff0c;我被邀请加入所谓的“抢先体验”计划&#xff0c;以试驾新服务并提供反馈。 多亏负责产品的经理Reza Shafii &#xff0c;我才可…

App Engine中的Google Services身份验证,第2部分

在本教程的第一部分中&#xff0c; 我描述了如何使用OAuth进行Google API服务的访问/身份验证。 不幸的是&#xff0c;正如我稍后发现的那样&#xff0c;我使用的方法是OAuth 1.0&#xff0c;显然现在Google正式弃用了OAuth 1.0&#xff0c;改用OAuth 2.0版本。 显然&#xff0…

[51nod1297]管理二叉树

一个初始为空的二叉搜索树T&#xff0c;以及1到N的一个排列P: {a1, a2, ..., aN}。我们向这个二叉搜索树T添加这些数&#xff0c;从a1开始, 接下来是 a2, ...&#xff0c; 以aN结束。在每一个添加操作后&#xff0c;输出T上每对节点之间的距离之和。例如&#xff1a;4 7 3 1 8 …

Java Swing中的聊天气泡

本文将向您解释“如何在Java swing应用程序中绘制聊天气泡&#xff1f;” 聊天气泡与呼出气泡或思想气泡相同。 今天&#xff0c;大多数聊天应用程序都以这种格式显示转换&#xff0c;因此本文将帮助您在用Java swing创建的桌面应用程序中进行相同的操作。 以下课程用于绘制第一…

java内存模型按照线程隔离性_深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性...

一、Java内存模型Java Memory Modle&#xff0c;简称 JMM&#xff0c;中文名称 Java内存模型&#xff0c;它是一个抽象的概念&#xff0c;用来描述或者规范访问内存变量的方式。因为各中计算机的操作系统和硬件不同&#xff0c;方式机制也可能不同&#xff0c;Java内存模型用于…

ZK实际应用:样式和布局

在之前的ZK in Action帖子中&#xff0c;我们使用ZK MVVM实现了CRUD功能 。 我们还快速浏览了一些样式代码&#xff0c;可能需要更多的解释。 在本文中&#xff0c;我们将讨论如何在ZK小部件上附加新CSS样式规则&#xff0c;以及如何覆盖现有样式。 我们还将介绍ZK中UI布局的一…

Tornado(一)

Tornado 特点 Tornado是一个用Python写的相对简单的、不设障碍的Web服务器架构&#xff0c;用以处理上万的同时的连接口&#xff0c;让实时的Web服务通畅起来。虽然跟现在的一些用Python写的Web架构相似&#xff0c;比如Django&#xff0c;但Tornado更注重速度&#xff0c;能够…

Android下Opengl ES实现单屏幕双眼显示

http://blog.csdn.net/u011371324/article/details/68946779 默认情况下&#xff0c;Opengl ES使用系统提供的帧缓冲区作为绘图表面&#xff0c;一般情况下&#xff0c;如果只在屏幕的表面绘图的话&#xff0c;系统提供的默认帧缓冲区很高效&#xff0c;但是很多应用程序需要渲…

Oracle Service Bus –线程阻塞案例研究

本案例研究描述了在AIX 6.1和IBM Java VM 1.6上运行的Oracle Service Bus 11g遇到的线程阻塞问题的完整根本原因分析过程。 本文也是您提高线程转储分析技能的绝佳机会&#xff0c;我强烈建议您学习并正确理解以下分析方法。 与过早的中间件&#xff08;Weblogic&#xff09;重…

java 可以重载等于号码_Java面试之Java基础4——重载与重写的区别

目录重载与重写的概念重载与重写的区别重载与重写的总结构造器是否能被重写override为什么函数不能根据返回类型来区分重载重载与重写的概念重载&#xff1a;同样一个方法可以根据输入参数列表的不同&#xff0c;做出不同的处理。普通方法和构造器方法都能够重载。方法重载&…

二维数组、多维数组

二维数组&#xff1a; 定义二维数组 int[,] myArray new int[几个一维数组,数组中的个数]; 数组可以具有多个维度。例如&#xff0c;下列声明创建一个四行两列的二维数组(可以理解为4个1维数组&#xff0c;数组中包含2个元素)&#xff1a; int[,] myArray new int[4,2]; int[…

一张大图片有多个小图片

这个页面也是我看到别人的写的&#xff0c;感觉不错&#xff0c;就自己留下了为了以后自己可以容易找到&#xff0c;也希望可以方便到别人。 写这个页面 需要注意的是&#xff1a; 1.写每一个小图片的位置时候&#xff0c;要用id,这样等级就高了&#xff0c;不然不起作用。 2.因…

Android Studio混淆

这一篇说一下Android Studio的代码混淆&#xff1a; 第一步&#xff1a;要想使混淆生效&#xff0c;要修改项目&#xff08;App&#xff09;下的build.gradle一处内容&#xff1a;minifyEnabled 的值 设置为true&#xff0c;当前项目就可以使用混淆了。 apply plugin: com.and…

Java 8:测试Lambda水

Java 8大约有一年的时间了&#xff0c;它具有我非常期待的语言功能&#xff1a; Lambda Expression 。 令人遗憾的是&#xff0c;另一个重要功能Java平台模块已延迟到Java9。但是&#xff0c;将lambda表达式&#xff08;或闭包&#xff09;添加到该语言中将使Java编程变得更好。…

基于阀值的工作流引擎设计

最近在做工作流处理流程部分的工作&#xff0c;顺便研究了一下工作流引擎的一些设计理念和原理。由于以前接触过人工智能神经网络的一些东西&#xff0c;发现工作流引擎和神经网络还是颇有一些相似之处&#xff0c;都是满足一定的条件下向下一个节点传递。在神经网络的神经元中…

Git之安装管理

1.Git安装部署 Git是分布式的版本控制系统&#xff0c;我们只要有了一个原始Git版本仓库&#xff0c;就可以让其他主机克隆走这个原始版本仓库&#xff0c;从而使得一个Git版本仓库可以被同时分布到不同的主机之上&#xff0c;并且每台主机的版本库都是一样的&#xff0c;没有主…

Java执行程序服务类型

ExecutorService功能是Java 5附带的。它扩展了Executor接口&#xff0c;并提供了线程池功能来执行异步简短任务。 使用Java 6提供的ExecutorService接口有五种异步执行任务的方法。 ExecutorService execService Executors.newCachedThreadPool&#xff08;&#xff09;; 这…

MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!

年少不知优化苦&#xff0c;遇坑方知优化难。 ——村口王大爷本文内容导图如下&#xff1a;我之前有很多文章都在讲性能优化的问题&#xff0c;比如下面这些&#xff1a;当然&#xff0c;本篇也是关于性能优化的&#xff0c;那性能优化就应该一把梭子吗&#xff1f;还是要符合一…