ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止。但有时需要在任务正在运行时取消他们,使得线程快速结束。对此Java并没有提供任何机制。但是我们可以通过Java提供的线程中断机制来实现。

首先来看Thread类三个和中断有关的方法:

public class Thread {// 发出一个中断请求,把标志位设定为中断状态,不会终止线程运行。// 其他线程试图调用该方法,会检测是否有权限中断该线程(正常情况// 下不会存在权限问题,这里可以忽略)public void interrupt() { ... }// 检测标志位是否为中断的状态public boolean isInterrupted() { ... }// 清除当前线程的标志位的中断状态,返回是否为中断状态public static boolean interrupted() { ... }...
}

既然线程中断不会终止线程的运行,那么如何通过线程中断来实现终止线程运行呢?

我们知道一些阻塞线程的方法会抛出InterruptedException表示线程中断发生,在这种情况下就可以使用线程中断来终止线程的运行:

public class TestInterrupt {public static void main(String[] args){BlockingQueue<Object> ObjectQueue = new LinkedBlockingQueue<Object>();Consumer consumer = new Consumer(ObjectQueue);Thread t = new Thread(consumer);t.start();// 等待线程的启动try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}// 中断线程t.interrupt();}}class Consumer implements Runnable
{private final BlockingQueue<Object> ObjectQueue;public Consumer(BlockingQueue<Object> ObjectQueue){if (ObjectQueue == null){throw new IllegalArgumentException("messageQueue cannot be null");}this.ObjectQueue = ObjectQueue;}@Overridepublic void run(){boolean isRunning = true;while (isRunning){try{// take方法阻塞时会因为线程中断抛出中断异常System.out.println(ObjectQueue.take());}catch (InterruptedException e){// 一旦抛出中断异常,线程的中断状态就会被清除,这个时候调用// Thread的isInterrupted()方法返回的是falseisRunning = false;System.out.println("Cancelled");}}}
}

很多任务执行的服务程序的逻辑和上面的例子很类似,都可以使用这种方法来终止线程的运行。

转载于:https://www.cnblogs.com/zhangxiaopeng/p/4811844.html

java线程中断和终止线程运行相关推荐

  1. 泥瓦匠聊并发编程基础篇:线程中断和终止

    原文:www.spring4all.com 1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性.而不是真正终止线程,和线程的状态无关.线程中断过程表示一个运行中的线程,通过其他线程调用 ...

  2. java中的强行终止线程的执行

    不合理 package com.bjpowernode.java.thread; /* 在java中怎么强行终止一个线程的执行.这种方式存在很大的缺点:容易丢失数据.因为这种方式是直接将线程杀死了,线 ...

  3. linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结

    1.介绍API 1.pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...

  4. c语言中终止线程的方法,终止线程优雅不使用TerminateThread()

    TerminateThread是一个坏主意,特别是如果你的线程使用同步对象,如互斥体.它可能导致未发布的内存和句柄,并导致死锁,所以你是正确的,你需要做别的事情. 通常,线程终止的方式是从定义线程的函 ...

  5. java 线程退出cmd_java 线程的终止与线程中断

    关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...

  6. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  7. 终止线程的2种方法。标记法和中断

    引言 在原来的jdk版本中: 提供了暂停,恢复,终止线程的方法,分别是suspend(),resume(),stop(); 但是它们都存在缺陷,比如暂停suspend()方法在调用后,线程不会释放资源 ...

  8. java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别

    很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了, Thread.currentThread().interrupt() 其实不是这 ...

  9. MySQL 查看和终止正在运行的连接线程

    文章目录 使用 SHOW 命令查看连接线程 使用 information_schema.processlist 使用 performance_schema.threads 使用 mysqladmin ...

最新文章

  1. 【ACM】杭电OJ 2149
  2. 在服务器虚拟化架构中有哪些技术功能和益处
  3. 【转】几种数据库的大数据批量插入
  4. 安卓pdf阅读器_2020年双十一有哪些电纸书、电子书阅读器值得买?Kindle、掌阅、文石、科大讯飞哪个好?...
  5. Linux终端命令工具修改语言切换中文
  6. 计算机1级b知识点,初中信息技术等级考试知识点
  7. Ajax的回调函数(js与JQuery写法)
  8. HTML5 通过Vedio标签实现视频循环播放
  9. 编写一个计算图形面积和周长的程序
  10. K8s 亲和性和非亲和性(Affinity)
  11. 人工智能发展史(读书笔记)
  12. 4行代码 超级简单 html/css 实现平移动画
  13. java 设计模式 常用21种
  14. python模拟鼠标点击和键盘输入的操作_python模拟鼠标点击和键盘输入的操作
  15. linux系统——管道
  16. staruml 时序图操作
  17. ctP2ISP:使用卷积和数据增强的转换器预测蛋白质-蛋白质相互作用位点
  18. C语言小新意-破壳日
  19. 基于QT实现简易音视频播放器
  20. 在国内考是考CISP还是CISSP呢?

热门文章

  1. snipaste安装和使用_snipaste替代品 amp; linux截图解决方案-截图、贴图工具Flameshot...
  2. 让我们了解下什么是智能客服(问答)
  3. 从小白到大数据人工智能专家的学习历程-送100G学习资料
  4. 期末计算机课总结100字,学期总结:学期总结100字
  5. android上方导航条跳转页面,Native Navigation导航组件的使用说明
  6. 加密模式 openssl sm4_OpenSSL/GmSSL 动态引擎
  7. C++ ------------------- string类介绍
  8. 盘点2012中国承载网十大事件(转)
  9. 软件测试中的风控,测试过程中会遇到哪些风险和机会?
  10. 山东民办计算机专业排名2015,2021年山东最好的民办大学排名