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,一经查实,立即删除!

相关文章

Android 上下文菜单(Context Menu)

一、概述 Android中&#xff0c;上下文菜单是通过onLongClick(...)事件访问的。在事件触发后显示菜单项。 在使用上下文菜单时&#xff0c;通常在onCreate(...)方法中&#xff0c;先行注册上下文菜单。在实现onCreateContextMenu(...)方法和onContextItemSelected(...)方法。 注…

RGB颜色空间alpha混合的方法

http://blog.csdn.net/xhhjin/article/details/6444782http://blog.csdn.net/xhhjin/article/details/6445460http://www.cnblogs.com/graphics/archive/2012/08/23/2643086.htmlhttp://www.oschina.net/code/snippet_1425046_27446 转载于:https://www.cnblogs.com/eustoma/p/…

Java怪异实践

总览 Java中有许多实践使我感到困惑。 这里只是一些。 使用-Xmx和-Xms 选项-Xmx广泛用于设置最大内存大小。 如Java HotSpot VM Options中所述&#xff0c;以-X开头的选项是非标准的&#xff08;不保证在所有VM实现中均受支持&#xff09;&#xff0c;并且在以后的JDK发行版中…

saml java实现_java-saml

软件简介java-saml 是 Java 的 SAML 开发包。Maven&#xff1a;com.oneloginjava-saml2.4.0示例代码&#xff1a;Map samlData new HashMap<>();samlData.put("onelogin.saml2.sp.entityid", "http://localhost:8080/java-saml-tookit-jspsample/metadat…

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

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

使用MongoDB的MapReduce

MapReduce是Google在2004年推出的一种软件框架&#xff0c;用于支持对计算机集群中的大数据集进行分布式计算。 您可以从此处阅读有关MapReduce的信息 。 MongoDB是用C 编写的面向开源文档的NoSQL数据库系统。 您可以从此处阅读有关MongoDB的更多信息。 1.安装MangoDB。 请遵…

java epson指令集_EPSON机械手 SPEL+语言指令集

下面是全部指令的简明列表&#xff0c;放在这里方便参考。之后重要的指令&#xff0c;勇哥要拿出来单独学习。系统管理相关命令Reset 将控制器重置为初始状态。SysConfig 显示系统设置参数。SysErr 返回最新的错误状态或警告状态。Date 显示日期。Time 显示时间。Date$ 以字符串…

1、关于action中解决跨域请求问题:

&#xff08;1&#xff09;、action中使用ajax传值时HttpServletRequest request ServletActionContext.getRequest(); String origin request.getHeader("Origin"); HttpServletResponse response ServletActionContext.getResponse(); response.setContentType(…

dom contains 包含关系

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>contains</title></head><body> <div id"p-node"> <div id"c-node">子节点内容&…

ANTLR:入门

这篇文章使您了解ANTLR的基础知识。 以前&#xff0c;我们已经了解了如何将ANTLR设置为外部工具。 在这里&#xff1a; ANTLR外部工具 :) 所以&#xff0c;我们开始…。 什么是ANTLR&#xff1f; •另一个语言识别工具&#xff0c;是一种语言工具&#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;可直…

【学习笔记】JavaScript基础(一)

【学习过程遇到疑问和延伸阅读】 1.document.write()的深入理解write()方法可向文档写入HTML表达式或JavaScript代码。可使用document.write()向输出流写文本或者HTML 延伸阅读《js中document.write的那点事》http://www.cnblogs.com/dh616854836/articles/2140349.html 2.编程…

js操纵cookie技术

<% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>图片浏览</title> <script typ…

java none怎么用tomcat_使用tomcat做java中间件

tomcat是一个老牌的中间件了&#xff0c;从我从业到现在时不时都会遇到它&#xff0c;方便、灵活、性能一般是我对它的使用经验总结。配置注意 &#xff1a; tomcat 7 和 6 有很大差别&#xff0c;server.xml catalina.sh 配置文件不能通用设置tomcat7 使用jdk1.7export JAVA_H…

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

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

MySQL 分组之后如何统计记录条数 gourp by 之后的 count()

SELECT count(*) FROM 表名 WHERE 条件 // 这样查出来的是总记录条SELECT count(*) FROM 表名 WHERE 条件 GROUP BY id //这样统计的会是每组的记录条数.如何获得 第二个sql语句的总记录条数? 则是&#xff0c;如下&#xff1a;    select count(*) from(SELECT count(*) F…

python CS游戏1--角色创建,武器购买

#codingutf-8 import random 本文字主要目的是随机创建一个角色&#xff0c;并且武器是随机产生的&#xff0c;自带系统给的费用10000,10000元钱可以购买武器&#xff0c;购买武器以后&#xff0c;钱会减少&#xff0c;直到不足提示无法购买 dir{"AK47":2000,"…

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

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

字符串常用操作

1 常用&#xff1a;分割、长度、索引、切片2 r (1,2,3,4,5)#只读列表元组3 name "liangml"4 strip5 username input("user:")6 if username.strip() "liangml":#strip可以将输入前后的空格都换掉7 print("welcome")8 9 split …

java 保存bufferedimage_java - 如何将BufferedImage保存为Fi

答案在于Java Documentation的编写/保存图像教程。SaveImage.java类提供以下保存图像的方法&#xff1a;static boolean ImageIO.write(RenderedImage im, String formatName, File output) throws IOException该教程解释了这一点BufferedImage类实现RenderedImage接口。所以它…