Java多线程之线程中止
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多线程之线程中止相关推荐
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- Java多线程之线程池配置合理线程数
Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...
- Java多线程之线程池的手写改造和拒绝策略
Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- Java多线程之线程通信之生产者消费者阻塞队列版
Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...
- Java多线程之线程虚假唤醒
Java多线程之线程虚假唤醒 本文目录提纲 问题:两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次. 问题:四个线程对一个初始值为零的变量操作,实现两个线程加一,另外两个线 ...
- Java多线程:线程安全和非线程安全的集合对象
转载自 Java多线程:线程安全和非线程安全的集合对象 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到 ...
- java 多线程使用线程池_Java多线程:如何开始使用线程
java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...
最新文章
- 【JavaScript总结】JavaScript语法基础:JS编码
- c++多线程并发执行
- 6G技术长啥样?5大趋势,13个核心技术2030年落地
- 首位植入脑机接口的患者通过Twitter发布信息
- centos 7挂载windows共享目录
- vc6.0报delete and rebuild Error executing link.exe.错误
- c语言指针概述,C语言指针概述.doc
- Combination Sum 和Combination Sum II
- PLECS软件学习使用(一)简单的RLC电路搭建
- latex目录标题中间空一个字符
- DevExpress DXperience 的ASPxFilterControl 不显示 Like 菜单的方法
- (转)web app 禁用手机浏览器缓存方法
- FPGA数字信号处理(十七)多级CIC滤波器Verilog设计
- poedit使用(本地化和国际化)
- Linux如何查看CPU温度
- unity游戏开发需要学什么?
- 怎么查看自己本地的ip地址
- 霍兰德职业规划测试软件,霍兰德职业兴趣测试
- 六轴多关节机器人跟四轴机器人差别在哪里呢
- Web性能测试自动化方案
热门文章
- 监测linux一些重要文件md5值脚本
- mysql 中文含数字排序_英语| 124期 Sort 坑爹的字符串排序
- 线性代数学习资料汇编
- 安装 | VMware Workstation Pro 16 for Unbuntu 20.10 虚拟机安装教程
- 问题 | CondaHTTPError: HTTP 404 NOT FOUND for url
- HTML中form和div出现间隙以及页面居中的问题
- mysql 线性表_数据结构-线性表之顺序表
- [置顶] C/C++超级大火锅
- 嵌入式系统的知识体系、学习误区及学习建议
- python文件传输模块_如何将python对象从一个文件模块传递到另一个文件模块?