Java 多线程学习(2)——停止线程

重新系统的学习一下Java多线程部分。参考书籍为《java多线程编程核心技术》。

在Java中,有以下三种方法可以终止正在运行的线程:

  1. 使用退出标志,使线程正常退出,即run方法完成后,线程终止;
  2. 使用stop方法,强行终止线程,不推荐使用,可能会产生不可预料的后果
  3. 使用interrupt方法中断线程。

使用interrupt方法停止线程

interrupt()方法仅仅是在当前线程中打了一个停止标记,并不会真正的停止线程。 示例如下:

public class Main {
    public static void main(String[] args) throws Exception {
        MyThread myThread = new MyThread();
        myThread.start();
        Thread.sleep(2000);
        myThread.interrupt();
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
        for (int i = 1; i <= 50000; i++) {
            System.out.println("i=" + i);
        }
    }
}

输出:

可以看出调用interrupt方法并没有停止线程。

判断线程是否是停止状态

Thread.java类中提供了两种方法判断线程是否是停止状态:

  1. this.interrupted():测试当前线程是否已经中断。执行后具有将状态置清除为false的功能。即连续两次调用该方法,第二次调用返回false(第一次调用已清除其中断转台,第二次调用之前,没有再次中断线程);
  2. this.isInterrupted():测试线程Thread对象是否已经中断。不清除状态标志。

根据线程状态终止线程

public class Main {
    public static void main(String[] args) throws Exception {
        MyThread myThread = new MyThread();
        myThread.start();
        Thread.sleep(2000);
        myThread.interrupt();
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
        for (int i = 1; i <= 500000; i++) {
            if(this.isInterrupted()) {//判断线程是否处于终止状态
                System.out.println("处于停止状态,退出线程!");
                return;
            }
            System.out.println("i=" + i);
        }
    }
}

输出:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏weixuqin 的专栏

leecode刷题(27)-- 合并k个排序链表

以前做过合并两个有序链表的问题,所以刚开始想到的解法与之类似,我们可以先合并两个有序链表,再用合并的新链表去合并第三个链表:

11330
来自专栏奕空

filebeat合并多行日志示例

时间戳 来自Elasticsearch等服务的活动日志通常以时间戳开始,然后是关于特定活动的信息,如下例所示:

36930
来自专栏Java技术栈

Spring Boot 注册 Servlet 的三种方法,真是太有用了!

本文栈长教你如何在 Spring Boot 注册 Servlet、Filter、Listener。

14350
来自专栏A周立SpringCloud

史上最污技术解读,我竟然秒懂了!

很多同学对热备,冷备,云备了解不深,我科普一下 IT 行业各种备份术语。以后别闹笑话了。

11320
来自专栏AI科技大本营的专栏

突发!Java首度承认失败,愿永久服软Python!网友:好想哭!

最近,这个格局已经被悄然打破,正是被来自曾经的小弟,新晋网红Python给硬生生拽下神坛。对此,Java曾表示强烈质疑,最近一份数据榜单悄悄来了!

14520
来自专栏芋道源码1024

为什么大部分码农做不了软件架构师?

小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL)。所以,架构师在广大码农中的占比大概平均不到 10%。而架构师也可以分为初级、中级、高级三档,...

14930
来自专栏Java帮帮-微信公众号-技术文章全总结

一个 Java 程序员眼中的 Go 语言

首先,我想做个免责声明,我不是 Go 语言专家。几周前我才开始学习,所以本文是我对 Go 的第一印象。文中我的一些主观看法可能是错的。以后我可能会发文再探讨本文...

24130
来自专栏Java3y

【JavaWeb基础】图书管理系统总结(修订版)

https://github.com/ZhongFuCheng3y/BookSystem

20720
来自专栏java思维导图

Java高效开发12个精品库

第一个要说的当然是JUnit了,JUnit毕竟是Java圈目前最知名及常用的测试框架。JUnit之所以能够成为Java圈中最热门的测试库,是因为对于很多项目而言...

12140
来自专栏码匠的流水账

聊聊elasticsearch的RoutingService

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/cluster/routing/Routi...

15600

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励