Java 线程的终止方式
线程的终止JDK中提供了stop()[不建议使用] 和 interrupt()两种方式,同时抛出一个未实现的destroy()[不能使用]方法,目前stop已经被废弃了,因为stop是暴力停止会存在安全问题正确的结束线程运行的方式:1、使用interrupt时 配合isInterruptedd()方法,可有效避免线程中断异常2、采用标志位的方式进行判断,当满足条件时结束线程的运行,该标志位需要对被各线程可见(volatile)
package com.milla.study.netbase.expert.concurrent;import lombok.extern.slf4j.Slf4j;/*** @Package: com.milla.study.netbase.expert.concurrent* @Description: <结束线程[如何优雅的结束线程]>* @Author: MILLA* @CreateDate: 2020/4/21 10:51* @UpdateUser: MILLA* @UpdateDate: 2020/4/21 10:51* @UpdateRemark: <>* @Version: 1.0*/
@Slf4j
public class InterruptThreadTest {public static void main(String[] args) throws InterruptedException {stopThread(); //错误的方式interruptThread();//正确方式1 采用Thread中的interrupt方法interruptThreadByFlag();//正确方式2 使用标志位}private static void interruptThreadByFlag() throws InterruptedException {FlagThread flagThread = new FlagThread();flagThread.start();Thread.sleep(1500L);flagThread.interruptThread();//产生的结果:i:1, j:1 不存在线程安全问题flagThread.printInfo();}private static void interruptThread() throws InterruptedException {StopThread stopThread = new StopThread();stopThread.start();Thread.sleep(1000L);if (stopThread.isInterrupted()) {//配合该线程的状态判断使用 可防止线程中断异常stopThread.interrupt();//产生的结果:i:1, j:1 不存在线程安全问题}stopThread.printInfo();}private static void stopThread() throws InterruptedException {StopThread stopThread = new StopThread();stopThread.start();Thread.sleep(1000L);stopThread.stop();//产生的结果:i:1, j:0 存在线程安全问题 废弃不用了stopThread.printInfo();}static class FlagThread extends Thread {private int i, j;private volatile boolean flag = true;@Overridepublic void run() {while (flag) {synchronized (this) {i++;try {Thread.sleep(500L);} catch (InterruptedException e) {e.printStackTrace();}j++;}}}void interruptThread() {//设置标志位flag = false;}void printInfo() throws InterruptedException {Thread.sleep(501L);log.info("产生的结果:i:{}, j:{}", i, j);}}static class StopThread extends Thread {private int i, j;@Overridepublic void run() {synchronized (this) {++i;try {Thread.sleep(1000L);} catch (InterruptedException e) {e.printStackTrace();System.out.println("报异常么");}++j;}}void printInfo() throws InterruptedException {Thread.sleep(10L);log.info("产生的结果:i:{}, j:{}", i, j);}}
}
Java 线程的终止方式相关推荐
- 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- java线程通讯的方式
java线程通讯的方式主要有三种 suspend/resume wait/notify park/unpark suspend/resume 正常的suspend/resume public void ...
- java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理
前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...
- java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理
前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...
- 并发基础(九) java线程的终止与中断
1.简单了解一下:为何不赞成使用 Thread.stop.Thread.suspend 和 Thread.resume? suspend .resume.stop方法分别完成了线程的暂停.恢复.终 ...
- 3线程的终止方式,线程属性,NPTL
1线程终止方式 如果需要只终止某个线程而不终止整个线程,可以有三种方法: A:从主线程函数return.这种方法对主线程不适合,从main函数return相当于调用exit. B:一个线程可以调 ...
- Java线程的创建方式
文章目录 创建线程的几种方法: ①继承Thread类 ②实现Rullable接口 ③实现Callable接口 Callable接口 Future 接口 FutureTask类 ④使用线程池 Runab ...
- 快点来学吧!java保证线程安全的方式
JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...
- java线程同步的实现方式
这里抛砖引玉,为何要使用同步? 当多个线程同时操作一个可共享的资源时会出现线程安全问题,将会导致数据不一致,因此使用同步锁来防止该操作执行完之前不许被其他线程执行,从而保证了该变量的唯一性和准确性.下 ...
最新文章
- C++之queue模板类
- jeecg3.5.2中上传下载文件的示例中的的一个bug
- 二叉树的层序遍历_NC15 求二叉树的层序遍历
- gitbook的使用
- python dict遍历文件_python 字典(dict)遍历的四种方法性能测试报告
- 计算机等级的有关知识,计算机等级二级基础知识.doc
- 数字信号处理——DFT的一些理解
- 服务器系统设计流程,图书馆管理系统设计(含业务流程图).doc
- 长沙理工 ACM 数位 DP 1488
- 复旦自考 网络专业 java 上机考_上海复旦大学自考方法及考试科目
- 摩拜前端周刊第15期
- 如何判断一个进程已经完成初始化?
- CISC 332*/CMPE 332* –Database Management Systems
- 监控oracle某条sql语句,Oracle-常用监控SQL语句
- MSM8926处理器
- hadoop服务器中断,Hadoop服务器上的虚拟内存错误
- rounded-{0 | top | right | bottom | left | circle } 边角半径设置 - bootStrap4常用CSS笔记(2019-05-16 09:38)...
- vue-router路由防卫
- JavaScript中的三个点(...)扩展运算符
- 软件工程 -- 程序流程图