广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Javainterrupt()方法使用实例介绍
  • 308
分享到

Javainterrupt()方法使用实例介绍

Javainterrupt()Javainterrupt()方法使用 2023-02-03 12:02:06 308人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言栗子一栗子二大栗子前言 进入正题之前还是先回顾一个会被问无数遍的问题: stop和interrupt的区别是什么? 简单的说就是,stop的话,那线程就真的结束了。 inte

前言

进入正题之前还是先回顾一个会被问无数遍的问题:

stop和interrupt的区别是什么?

简单的说就是,stop的话,那线程就真的结束了。

interrupt仅仅只是给线程标记了一下,告诉你说当前线程可以结束了,你需要自己进行结束线程。如果你自己不做处理,那这个方法调用了并看不出效果。

栗子一

不带sleep等中断抛异常方法的使用

上代码:

public class TestClassSenseOne {
    public static void main(String[] args) throws InterruptedException {
        TestThread t = new TestThread();
        //开启子线程执行
        t.start();
        //中断子线程
        t.interrupt();
        //等待子线程执行完毕,t.join() 可以这么理解,谁.join() 谁阻塞当前线程先执行自己
        t.join();
        System.out.println("主线程结束");
    }
}
class TestThread extends Thread {
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            //没有被标记为中断状态就执行,上面start后直接调用中断,这句是不会输出的
            System.out.println("我没有被中断");
        }
        System.out.println("啊——————————————————————————————断了。");
    }
}

运行结果:

啊——————————————————————————————断了。
主线程结束

说明:

上面这段代码就是,interrupt()的基本用法,子线程TestThread会一直判断当前线程有没有被标记为可以中断了,直到检查到被标记了,while循环结束,子线程任务结束。

栗子二

带sleep的使用

public class TestClassSenseTwo {
    public static void main(String[] args) throws InterruptedException {
        TestThreadTwo t = new TestThreadTwo();
        //开启子线程执行
        t.start();
        //模拟真实任务,其实执行5秒就执行完了,再继续等待到20s毫无意义
        Thread.sleep(5000);
        System.out.println("模拟真实任务,其实执行5秒就执行完了,再继续等待到20s毫无意义");
        //所以在这里中断子线程
        t.interrupt();
        //等待子线程执行完毕,t.join() 可以这么理解,谁.join() 谁阻塞当前线程先执行自己
        t.join();
        System.out.println("主线程结束");
    }
}
class TestThreadTwo extends Thread {
    @Override
    public void run() {
        try {
            System.out.println("开始执行20秒的任务");
            Thread.sleep(20000);
            System.out.println("线程任务执行完毕");
        } catch (InterruptedException e) {
            System.out.println("线程在sleep的时候被中断。");
            return;
        }
    }
}

运行结果:

开始执行20秒的任务
模拟真实任务,其实执行5秒就执行完了,再继续等待到20s毫无意义
线程在sleep的时候被中断。
主线程结束

可以看到,这里了结束子线程的操作输出是在 catch块中做的,因为sleep被中断会抛出InterruptedException异常,同时也会清除当前线程被标记的 可被结束状态,如果不在catch块中结束,那么interrupt的调用并不能提前结束子线程。

大栗子

场景下使用的例子

描述:

我在程序启动时有一个检查菜单的任务,这个任务需要一直被执行,直到检查成功。

思路:

我先定义一个任务线程类,在其中while (!Thread.currentThread().isInterrupted())执行检查菜单方法,当检查菜单方法使用interrupt中断任务时说明任务完成。

上代码:

检查方法的Service接口

public interface TestService {
    void checkMenu() throws InterruptedException;
}

实现类

public class TestServiceImpl implements TestService {
    @Override
    public void checkMenu() throws InterruptedException {
        System.out.println("检查菜单----------->");
        //模拟随机成功与失败
        if (Math.random() * 10 > 4) {
            //模拟执行检查任务需要3秒耗时
            Thread.sleep(3000);
            //使用中断的方式,结束任务。
            System.out.println("检查任务完成******************,checkMenu()  使用interrupt()结束任务");
            Thread.currentThread().interrupt();
        }
    }
}

任务类

class DoMenuCheckTask extends Thread {
    @Override
    public void run() {
        TestService testService = new TestServiceImpl();
        //如果当前线程没有被中断,说明 checkMenu 没有真正成功
        while (!Thread.currentThread().isInterrupted()) {
            try {
                testService.checkMenu();
                
//                System.out.println("菜单检查没有通过中断完成任务,休眠5秒后继续执行----------");
//                //如果这里使用了 sleep 那么任务便是通过下面catch块中结束。
//                Thread.sleep(5000);
            } catch (InterruptedException e) {
                //被中断,任务结束
                e.printStackTrace();
                System.out.println("菜单检查通过中断interrupt成功完成----------->>>>>>>>");
                return;
            }
        }
    }
}

执行

public class SceneExample {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("主线程开始执行----------->>>>>>>>");
        DoMenuCheckTask task = new DoMenuCheckTask();
        //开始菜单检查执行任务
        task.start();
        //让检查任务先执行
        task.join();
        System.out.println("主线程结束执行----------->>>>>>>>");
    }
}

不使用sleep输出结果:

主线程开始执行----------->>>>>>>>
检查菜单----------->
检查任务完成******************,checkMenu()  使用interrupt()结束任务
主线程结束执行----------->>>>>>>>

Process finished with exit code 0

使用sleep的输出结果:

主线程开始执行----------->>>>>>>>
检查菜单----------->
检查任务完成******************,checkMenu()  使用interrupt()结束任务
菜单检查没有通过中断完成任务,休眠5秒后继续执行----------
菜单检查通过中断interrupt成功完成----------->>>>>>>>
主线程结束执行----------->>>>>>>>
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.kusch.demo.test.example.DoMenuCheckTask.run(SceneExample.java:47)

Process finished with exit code 0

到此这篇关于Java interrupt()方法使用实例介绍的文章就介绍到这了,更多相关Java interrupt()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Javainterrupt()方法使用实例介绍

本文链接: https://www.lsjlt.com/news/194109.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Javainterrupt()方法使用实例介绍
    目录前言栗子一栗子二大栗子前言 进入正题之前还是先回顾一个会被问无数遍的问题: stop和interrupt的区别是什么? 简单的说就是,stop的话,那线程就真的结束了。 inte...
    99+
    2023-02-03
    Java interrupt() Java interrupt()方法使用
  • Spring Cloud OpenFeign实例介绍使用方法
    目录一. OpenFeign概述二. 使用步骤2.1 feign接口模块2.1.1依赖配置2.1.2编写FeignClient的接口, 并加@FeignCleint 注解2.2 消费...
    99+
    2022-11-13
  • C#接口方法的实例介绍
    本篇内容介绍了“C#接口方法的实例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!公有方法实现C#接口方法尽管C#在定义接口时不用指明接口...
    99+
    2023-06-18
  • JavaScriptreduce方法使用方法介绍
    目录1. reduce方法的使用2. reduce数组的使用场景2.1 扁平化数组2.2 数组去重2.3 计算数组最大/最小值2.4 数组求和2.5 计算数组中元素的出现次数3. 操...
    99+
    2022-11-13
    JavaScript reduce JS reduce
  • js的math对象方法实例介绍
    本篇内容主要讲解“js的math对象方法实例介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js的math对象方法实例介绍”吧!Math对象方法//返回最大值...
    99+
    2022-10-19
  • python EasyOCR库实例用法介绍
    说明 EasyOCR是一个用python编写的OCR三方库。可以在python中调用,用来识别图像中的文字,并输出为文本。 支持80多种语言的识别,识别精度高,甚至要超过PaddleOCR。 安装命令 pip i...
    99+
    2022-06-02
    python EasyOCR库
  • php命名空间举例介绍使用方法
    命名空间是为了解决当前文件内相同作用域内常量名之间、函数名之间、类名之间的命名冲突。 在 PHP 中变量名是不会冲突的,在相同作用域内,对于同一个变量,最后一个变量会取代前一个变量的...
    99+
    2022-11-13
  • 15个JavaScript数组方法的实例介绍
    本篇内容主要讲解“15个JavaScript数组方法的实例介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“15个JavaScript数组方法的实例介绍”吧!在...
    99+
    2022-10-19
  • Kotlin ContentProvider使用方法介绍
    目录1、注册ContentProvider2、内容URI内容URI的标准格式通配符3、创建自己的ContentProvider4、访问其他程序中的数据1、注册ContentProvi...
    99+
    2022-11-13
  • AndroidLeakCanary的使用方法介绍
    目录1.LeakCanary 如何自动初始化2.LeakCanary如何检测内存泄漏2.1LeakCanary初始化时做了什么2.2LeakCanary如何触发检测2.3LeakCa...
    99+
    2022-11-13
  • String.format()方法的使用介绍
    String.format() 方法中的 % 符号用作占位符,用于将值插入字符串中。它用于使用特定值(例如整数、浮点数或字符串)格式化字符串。% 符号后面跟着一个字母,指定要插入的值的类型,例如 %d 表示整数,%s 表示字符串。要插入的...
    99+
    2023-09-07
    java 开发语言 spring servlet
  • mysqldump的使用方法介绍
    这篇文章主要介绍了mysqldump的使用方法介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1、说明mysqldump在库被删除的情况下,无法直接从文件恢复,需要手动新建同名库,才能从文件恢复数据。2、语法shell...
    99+
    2023-06-15
  • SpringBoot中activeMq的用法实例介绍
    本篇内容主要讲解“SpringBoot中activeMq的用法实例介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中activeMq的用法实例介绍”吧!SpringBoot...
    99+
    2023-06-20
  • ReactHooks使用方法全方位介绍
    目录hooks介绍useState(保存组件状态)useEffect()useCallback(记忆函数)useMemo(记忆组件)useRef(保存引用值)useReducerus...
    99+
    2023-03-19
    React Hooks React Hooks方法
  • fastjson 使用方法详细介绍
    Fastjson介绍Fastjson是一个Java语言编写的JSON处理器。遵循http://json.org标准,为其官方网站收录的参考实现之一。功能qiang打,支持JDK的各种类型,包括基本的JavaBean、Collection、M...
    99+
    2023-05-30
    fastjson 使用
  • android startActivityForResult的使用方法介绍
    Activity 跳转 都知道用startActivity(Intent)但是如果下面情况呢?Activity1 跳转到 Activity2  但是还需要在Activ...
    99+
    2022-06-06
    方法 Android
  • HTML5标签使用方法介绍
    这篇文章主要讲解了“HTML5标签使用方法介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML5标签使用方法介绍”吧!HTML 5 是一个新的网络标准...
    99+
    2022-10-19
  • android之HttpPostHttpGet使用方法介绍
    直接讲用法,先知道怎么用,再知道怎么回事 1、HttpPost 代码如下: try{ //创建连接 HttpClient httpClient = new DefaultHt...
    99+
    2022-06-06
    方法 Android
  • pythonsys模块使用方法介绍
    Python中的sys模块主要用于程序与解释器的交互,提供一系列函数和变量来处理Python运行环境 1、sys.api_version -----获取当前python内部版本号 i...
    99+
    2022-11-11
  • pythonos.path模块使用方法介绍
    os.path模块是os模块根据系统类型从另一个模块导入的,并非由os模块实现 1、os.path.abspath(相对路径)-----返回对应路径的绝对路径 os.path.abs...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作