shop()

Java中提供了shop()方法来中断线程,但其过于暴力而被定义为过期方法。假如一条线程在修改一段数据时,且已经修改了一半,此时的你强行用shop()方法中断该线程后,数据处于一半修改过、一半未修改的状态,该数据就已经废了(且不会有任何提示)。除非你清楚在干什么,否则不要使用shop()。

Java中推荐使用中断:

public void Thread.interrupt() //中断线程

public boolean Thread.isInterrupted()    //判断是否被中断

public static boolean Thread.interrupted()    //判断是否被中断,且清除当前中断状态

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread() {@Overridepublic void run () {while (true) {Thread.yield();}}
};t1.start();Thread.sleep(2000);ti.interrupt();
}
复制代码

在这里虽然调用了interrupt()方法,但该线程并不会停下。因为该方法只是设置了一个中断状态,但该线程并未对此中断状态做出反应。

以下代码进行了对中断状态的处理。

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread() {@Overridepublic void run () {while (true) {if (Thread.currentThread().isInterrupted()){     //此方法返回中断状态,且不会清除该中断状态。System.out.println("Interruted!");breadk;}Thread.yield();}}
};t1.start();Thread.sleep(2000);ti.interrupt();
}
复制代码

但我们使用wait() 或者 sleep() 方法时要注意下:

首先得了解下Thread.sleep()函数:

public static native void sleep(long millis) throws InterruptedException

当该线程休眠时如果中断则会抛出该错误,此异常非运行时异常,必须捕获且处理。

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread() {@Overridepublic void run () {while (true) {if (Thread.currentThread().isInterrupted()){//此方法返回中断状态,且不会清除该中断状态System.out.println("Interruted!");break;}try {Thread.sleep(2000);} catch (InterruptedException e) {System.out.println("Interruted When Sleep");// 设置中断状态Thread.currentThread().interrupt();}Thread.yield();}}
};t1.start();Thread.sleep(2000);t1.interrupt();
}
复制代码

在catch语块中本可以进行中断退出,但我们没这么做,因为这样会破坏数据一致性和完整性(和直接使用shop()用异曲同工之妙)。所以我们在异常处理中必须重新设置中断状态(因为此时抛出异常后状态会被清除),让该线程完成工作后再退出。

Java多线程之线程中止相关推荐

  1. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  2. Java多线程之线程池配置合理线程数

    Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...

  3. Java多线程之线程池的手写改造和拒绝策略

    Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...

  4. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  5. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  6. Java多线程之线程通信之生产者消费者阻塞队列版

    Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...

  7. Java多线程之线程虚假唤醒

    Java多线程之线程虚假唤醒 本文目录提纲 问题:两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次. 问题:四个线程对一个初始值为零的变量操作,实现两个线程加一,另外两个线 ...

  8. Java多线程:线程安全和非线程安全的集合对象

    转载自  Java多线程:线程安全和非线程安全的集合对象 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到 ...

  9. java 多线程使用线程池_Java多线程:如何开始使用线程

    java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...

最新文章

  1. 【JavaScript总结】JavaScript语法基础:JS编码
  2. c++多线程并发执行
  3. 6G技术长啥样?5大趋势,13个核心技术2030年落地
  4. 首位植入脑机接口的患者通过Twitter发布信息
  5. centos 7挂载windows共享目录
  6. vc6.0报delete and rebuild Error executing link.exe.错误
  7. c语言指针概述,C语言指针概述.doc
  8. Combination Sum 和Combination Sum II
  9. PLECS软件学习使用(一)简单的RLC电路搭建
  10. latex目录标题中间空一个字符
  11. DevExpress DXperience 的ASPxFilterControl 不显示 Like 菜单的方法
  12. (转)web app 禁用手机浏览器缓存方法
  13. FPGA数字信号处理(十七)多级CIC滤波器Verilog设计
  14. poedit使用(本地化和国际化)
  15. Linux如何查看CPU温度
  16. unity游戏开发需要学什么?
  17. 怎么查看自己本地的ip地址
  18. 霍兰德职业规划测试软件,霍兰德职业兴趣测试
  19. 六轴多关节机器人跟四轴机器人差别在哪里呢
  20. Web性能测试自动化方案

热门文章

  1. 监测linux一些重要文件md5值脚本
  2. mysql 中文含数字排序_英语| 124期 Sort 坑爹的字符串排序
  3. 线性代数学习资料汇编
  4. 安装 | VMware Workstation Pro 16 for Unbuntu 20.10 虚拟机安装教程
  5. 问题 | CondaHTTPError: HTTP 404 NOT FOUND for url
  6. HTML中form和div出现间隙以及页面居中的问题
  7. mysql 线性表_数据结构-线性表之顺序表
  8. [置顶] C/C++超级大火锅
  9. 嵌入式系统的知识体系、学习误区及学习建议
  10. python文件传输模块_如何将python对象从一个文件模块传递到另一个文件模块?