一 正常结束。

package com.aaa.threaddemo;
/*
一 终止线程的四种方式?
* 程序运行结束,线程终止。
*
*/
public class ThreadTermination {
public static void main(String[] args) { // 正常方式 把线程放入到thread中, 调用start方法。
Thread thread = new Thread(new Runnable() {
public void run() {
System.out.println(111);
}
}); thread.start();
} }

二  使用退出标志

package com.aaa.threaddemo;
/*
一 终止线程的四种方式?
* 程序运行结束,线程终止。
*
* 使用退出标志,退出线程
* 正常而言,线程执行完run方法,就会结束。但是有些线程是服务线程,需要长时间运行。
* 可以在外部设置一个条件,满足条件时才关闭线程。
*/
public class ThreadTermination {
public static void main(String[] args) throws InterruptedException {
ThreadIf thread = new ThreadIf(); thread.start(); // 休息一会
thread.sleep(2000); // 改变条件状态
thread.exit = true; System.out.println("线程结束");
}
} class ThreadIf extends Thread{ //volatile 关键字使exit同步,同一时刻,只有一个线程来修改exit。
volatile boolean exit = false; @Override
public void run() {
// 条件是true 一直执行
while (!exit) {
System.out.println(Thread.currentThread().getName());
}
}
}

3 interrupt 方法

package com.aaa.threaddemo;
/*
一 终止线程的四种方式?
* 1.程序运行结束,线程终止。
*
* 2.使用退出标志,退出线程。自定义条件。
* 正常而言,线程执行完run方法,就会结束。但是有些线程是服务线程,需要长时间运行。
* 可以在外部设置一个条件,满足条件时才关闭线程。
*
* 3.interrupt方法来中断线程,可以分为两种情况
* a 线程处于阻塞状态: 当线程使用了sleep wait socket中的receiver ,accept等方法时。
* 此时调用线程的interrupt方法,会抛出interruptException。
* 阻塞中的方法抛出异常,通过代码捕获,然后break跳出循环状态,才能正常结束run方法。
*
* b 线程是未阻塞状态, 使用isinterrupt 方法判断线程的中断标志来退出循环。
* 使用interrupt方法,会把中断标志设置为true。
* 和使用自定义标志来控制循环是一样的。
*
* 什么是中断?
* Java中用于停止线程的机制------中断。
* 中断是一种协作机制,中断的过程需要程序员自己实现。调用interrupt方法也只是将标示设置为true。
* 每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;
* 通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。
*
* 为什么使用中断?
* 在可能会发生的中断线程中,一直监听中断的状态,一旦发生了中断,就执行相关代码,进行处理。
* while(thread.isInterrupted()){ //没有中断,继续执行
* xxxxxx
* }
*
* // 发生中断了 需要的处理
* System.out.println("发生了中断,请处理。。。");
*
*/
public class ThreadTermination {
public static void main(String[] args) throws InterruptedException {
ThreadIf thread = new ThreadIf(); //isInterrupted 判断调用者线程的中断标志 false or true ,验证状态。
if (thread.isInterrupted()) {
System.out.println("当前的状态是false,不会输出本条语句");
} thread.start(); /*
把中断的标志 设置为true ,通知线程应该中断了。
此时线程是非阻塞状态,将会正常执行,不受影响。
*/
thread.interrupt(); //再次验证,此时已经中断 条件是true 可以输出语句。 使用while 就可以一直执行,和使用自定义的条件,是一样的效果。
if (thread.isInterrupted()) {
System.out.println("isInterrupted 判断调用者线程的中断标志 false or true ,验证状态。 标识是true,输出本条语句");
} //interrupted 方法有两个作用。会返回当前的中断状态,并且清除中断状态。 会把true,变为false
boolean b = thread.interrupted(); if (!b) {
System.out.println("interrupted() 会返回当前的中断状态,并且清除中断状态。 会把true,变为false ");
}
}
} class ThreadIf extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}

四  stop

package com.aaa.threaddemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /*
一 终止线程的四种方式?
* 1.程序运行结束,线程终止。
*
* 2.使用退出标志,退出线程。自定义条件。
* 正常而言,线程执行完run方法,就会结束。但是有些线程是服务线程,需要长时间运行。
* 可以在外部设置一个条件,满足条件时才关闭线程。
*
* 3.interrupt方法来中断线程,可以分为两种情况
* a 线程处于阻塞状态: 当线程使用了sleep wait socket中的receiver ,accept等方法时。
* 此时调用线程的interrupt方法,会抛出interruptException。
* 阻塞中的方法抛出异常,通过代码捕获,然后break跳出循环状态,才能正常结束run方法。
*
* b 线程是未阻塞状态, 使用isinterrupt 方法判断线程的中断标志来退出循环。
* 使用interrupt方法,会把中断标志设置为true。
* 和使用自定义标志来控制循环是一样的。
*
* 什么是中断?
* Java中用于停止线程的机制------中断。
* 中断是一种协作机制,中断的过程需要程序员自己实现。调用interrupt方法也只是将标示设置为true。
* 每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;
* 通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。
*
* 为什么使用中断?
* 在可能会发生的中断线程中,一直监听中断的状态,一旦发生了中断,就执行相关代码,进行处理。
* while(thread.isInterrupted()){ //没有中断,继续执行
* xxxxxx
* }
*
* // 发生中断了 需要的处理
* System.out.println("发生了中断,请处理。。。");
*
* 4 stop 暴力终止线程。 释放锁,容易造成数据的不一致。
* 直接将线程强行终止,已经是过期作废的方法。这个方法是不安全的,不推荐使用。
*
* 不安全的原因?
* 调用stop 方法后,创建子线程的线程会抛出错误,会把子线程的所有锁释放,
* 一般任何进行加锁的代码快,都是为了保证数据的一致性。
* 如果使用stop方法导致,子线程释放了所有锁,被保护的数据就会不一致。
*
*/

线程终止的四种方式,interrupt 方法使用的简单介绍。的更多相关文章

  1. java线程实现的四种方式

    java多线程的实现可以通过以下四种方式 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.通过Callable和FutureTask创建线程 4.通过线程池创 ...

  2. Java线程同步的四种方式详解(建议收藏)

    ​ Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式@mikechen 目录 什么是线程同步 线程同步的几种方式 1.使用sync ...

  3. C++线程同步的四种方式(Windows)

    为什么要进行线程同步? 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的 ...

  4. C++ 线程同步的四种方式

    程之间通信的两个基本问题是互斥和同步. (1)线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. (2)线程互 ...

  5. Python 线程启动的四种方式

    import threading,_thread def action(i): print(i **32) #带有状态的子类 class Mythread(threading.Thread): def ...

  6. 【Linux】多线程同步的四种方式

    背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include <iostream> #include<pthread.h> ...

  7. UI的线程问题:单线程原因及更新UI的四种方式

    1.UI线程为什么设计为单线程? UI控件的操作不是线程安全的,对于多线程并发访问的时候,如果使用加锁机制会导致: UI控件的操作变得很复杂. 加锁的操作必定会导致效率下降. 所以android系统在 ...

  8. Java创建线程的四种方式

    Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...

  9. java线程阻塞唤醒的四种方式

    java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析 suspend与resume Java废弃 suspend() 去 ...

随机推荐

  1. P1599 货币

    背景 又是一道水题 描述 在某个神秘的星球上有一种货币,它有一种奇怪的兑换规则 你有且仅有一枚面值为n的金币,你可以去银行进行兑换,也可以不兑换 如果去银行兑换,兑换的规则是这样的:用面值为a的金币去 ...

  2. 源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

    1. 概述 老话说的好:要善于思考,有创新意识. 言归正传,之前聊了 Springboot 的启动过程,今天来聊聊 Eureka Client 的注册过程. 2. Eureka Client 的注册过 ...

  3. Exponential family of distributions

    目录 定义 性质 极大似然估计 最大熵 例子 Bernoulli 指数分布 正态分布 Choi H. I. Lecture 4: Exponential family of distributions ...

  4. CS5211完全替代兼容LT7211|PS8625|CH7511方案|EDP转LVDS|Capstone CS5211

    CH7511|LT7211|PS8625替代方案--Capstone CS5211AN 设计EDP转LVDS优势方案原理图+PCB板设计 CH7511|LT7211|PS8625这三款都是专门用于设计 ...

  5. Eclipse中英文对照表(整理笔记)

    Eclipse百度界面中英文对照 目录 Eclipse百度界面中英文对照 0.菜单栏 1.File 文件菜单 2.Edit 编辑菜单 3.Source 源代码 4.Refactor 重构 5.Navi ...

  6. 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)

    查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...

  7. VNC的安装和使用

    说明 VNC (Virtual Network Console)是虚拟网络控制台的缩写.它是能远程连入Linux进行图形化操作. VNC百度百科介绍:https://baike.baidu.com/i ...

  8. 首次分享,大厂资深测试做Api接口自动化测试的关键思路都在这里了

    引言 与UI相比,接口一旦研发完成,通常变更或重构的频率和幅度相对较小.因此做接口自动化的性价比更高,通常运用于迭代版本上线前的回归测试中. 手工做接口测试,测试数据和参数都可以由测试人员手动填写和更 ...

  9. netty系列之:netty对SOCKS协议的支持

    目录 简介 SocksMessage Socks4Message Socks5Message 总结 简介 SOCKS是一个优秀的网络协议,主要被用来做代理,它的两个主要版本是SOCKS4和SOCKS5 ...

  10. unittest_skip跳过用例执行(3)

    在执行测试用例时,有时候有些用例是不需要执行的,比如版本迭代用例弃用,测试周期短只需要执行优先级高的用例,那我们怎么办呢?难道删除这些用例?那下次执行时如果又需要执行这些用例时,又把它补回来?这样操作 ...