方式一

使用退出标识,使得线程正常退出,即当run方法完成后进程终止。

public class TestFlagStop implements Runnable{//1、设置一个标示位private boolean flag = true;@Overridepublic void run() {int i = 0;while(flag) {System.out.println("run...Thread"+i++);}}//2、设置一个公共的方法停止线程,转换标志位public void stop() {this.flag = false;}public static void main(String[] args) {TestFlagStop testStop = new TestFlagStop();new Thread(testStop).start();for (int i = 0; i < 1000; i++) {System.out.println("main"+i);if(i==900) {//调用stop方法切换标志位,让线程停止testStop.stop();System.out.println("线程该停止了");}}}
}

方式二

停止一个线程在之前老的JDK中使用的是Thread.stop()方法,但是后面发现这种处理方法是很危险而且不安全的,由于stop()方法已经在JDK中被标明是“作废/过期”的方法,显然它在功能上是具有缺陷的。这里直接遗弃掉即可。

方式二

使用interrupt方法中断线程。

首先我们用for-break配合interrupt方式停止线程:

public class InterruptBreakStop extends Thread {@Overridepublic void run() {for (int i = 0; i < 500000; i++) {if (this.isInterrupted()) {System.out.println("已经是停止状态了!我要退出了!");break;}System.out.println("i=" + (i + 1));}System.out.println("我被输出,如果此代码是for又继续运行,线程并未停止!");}public static void main(String[] args) {InterruptBreakStop thread = new InterruptBreakStop();thread.start();try {Thread.sleep(2000);thread.interrupt();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("end!");}
}

从这里可以发现,break只是跳出for循环,而for循环之后的代码照常会运行!

为了解决这种问题,可以采用return的方式终止线程。

public class InterruptReturnStop extends Thread {@Overridepublic void run() {while (true) {if (this.isInterrupted()) {System.out.println("停止了!");return;}System.out.println("time=" + System.currentTimeMillis());}}public static void main(String[] args) throws InterruptedException {InterruptReturnStop thread=new InterruptReturnStop();thread.start();thread.sleep(2000);thread.interrupt();}
}

输出结果:

一般推荐抛异常的方式,这样才能使得线程停止得以扩散。

public class InterruptExceptionStop extends Thread {@Overridepublic void run() {try {while (true) {if (this.isInterrupted()) {System.out.println("停止了!");throw new InterruptedException();}System.out.println("time=" + System.currentTimeMillis());}} catch (InterruptedException e) {System.out.println( "抛异常了" );e.printStackTrace();}}public static void main(String[] args){InterruptExceptionStop thread=new InterruptExceptionStop();thread.start();try {thread.sleep(2000);thread.interrupt();} catch (InterruptedException e) {System.out.println( "抛异常了呀" );e.printStackTrace();}}
}


注意:

如果在sleep状态下使用interrupt()停止某一线程,会进入catch语句,并且清除停止状态值,使之变为false。可以理解为互斥关系,一旦使用这个interrupt方法,就不能让线程进入休眠状态。否则就会报这个错误。

多线程停止的几种方式(详细讲解)相关推荐

  1. 多线程实现的几种方式

    多线程实现一共有四种方式,如下图: - pthread的使用 - 定义pthread typedef __darwin_pthread_t pthread_t; - 创建pthread int pth ...

  2. Linux C++多线程同步的四种方式

    目录 一.互斥锁 二.条件变量 三.读写锁 原文链接:Linux C++多线程同步的四种方式(非常详细)_Y先森0.0-CSDN博客 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通 ...

  3. java多线程的实现方式_JAVA多线程实现的三种方式

    最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结. 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用E ...

  4. JavaEE多线程基本概念 及 创建多线程程序的三种方式

    Hello! 大家好.(非常平庸的开场白 习惯一下).此篇博客是我的"处女作",因为是第一次写博客,在文章格式以及文章内容可能会有许多问题和缺陷.欢迎各位大神对我的文章进行指正!我 ...

  5. java几种多线程_Java多线程实现的几种方式

    Java多线程实现的几种方式 多进程是计算机中的一个重要概念,通常一个任务称为一个进程,比如浏览网页.播放音乐都是一个进程. 在进程内部可能还需要执行多个子任务,比如在使用word文档打字的时候,不仅 ...

  6. java实现线程的方式_java多线程实现的四种方式

    java多线程实现的四种方式1.继承Thread类,重写run方法(其实Thread类本身也实现了Runnable接口) 2.实现Runnable接口,重写run方法 3.实现Callable接口,重 ...

  7. python停止线程_python线程之八:线程停止的3种方式,5个实例

    线程模块没有停止方法,是为了安全,但是我们需要停止子线程呢. 我这里给出四种安全停止线程的方式,加一种网上给出了强制停止线程的方式 安全停止的四种方式是,判断标识,退出线程 强制停止线程的方式是,ct ...

  8. 多线程实现的四种方式

    Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...

  9. JAVA多线程实现的三种方式

    文章目录 继承Thread类实现多线程 实现Runnable接口方式实现多线程 区别 ExecutorService/Callable/Future实现有返回结果的多线程 步骤 概念 实例(可忽略) ...

  10. Qt实现多线程编程的两种方式

    Qt实现多线程编程的两种方式 方式一: 继承自QThread类,覆写run函数.此实现方法只有run函数内的代码是运行在子线程内. 代码示例: #ifndef QDEMOTHREAD_H #defin ...

最新文章

  1. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载
  2. 数组中查找並返回数组_用Python查找数组中出现奇数次的那个数字
  3. NARF(Normal Aligned Radial Feature)关键点
  4. asp之GetArray提取链接地址,以$Array$分隔的代码
  5. 内存延时cl_内存频率和CL延迟哪个重要
  6. Python格式化字符串知多少
  7. U3D中物体的渲染顺序
  8. atitit.loading的设计与实现控件选型attilax 总结
  9. 科技论文----论搜索引擎现状及发展趋势
  10. 游戏建模用什么软件,学游戏建模哪里好?
  11. java可以连接php吗_java - 需要PHP或Java代码才能使用多个Internet连接
  12. 设计模式的一些小整理
  13. IntelliJ IDEA提示忽略大小写
  14. ones eye rand randn diag randperm
  15. Relay log read failure解决办法
  16. CTF—攻防练习之HTTP—命令执行漏洞
  17. 区块链 Gossip Protocol是什么
  18. 华为查看mpls的命令_华为BGP基本命令
  19. 详解Java设计模式之观察者模式(Observer Pattern)
  20. Python通过selenium操作edge浏览器

热门文章

  1. 人工智能的十大应用方向是哪些?
  2. 第三方支付接口搜集(附下载)
  3. Python Pandas PK esProc SPL,谁才是数据预处理王者?
  4. 浏览器主页被篡改劫持怎么办
  5. 研究生如何学习与科研的几点建议——来自一枚菜博的愚见
  6. java文件转换pdf模糊_java 库将 pdf 文件转换成高清图片方法
  7. 【优化布局】基于粒子群算法求解带出入点的车间布局优化问题附matlab代码
  8. AtCoder Beginner Contest 158 D.String Formation
  9. 用c语言编程,统计大写字母,小写字母,数字,其他字符的个数,用C语言:输入一行字符,不超过50个,统计出其中英文大写字母,小写字母,数字,空格以及其他字符个数...
  10. Apache web服务器 的下载安装