《Java 多线程编程核心技术》笔记——第1章 Java 多线程技能(二)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

声明:

本博客是本人在学习《Java 多线程编程核心技术》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。

本博客已标明出处,如有侵权请告知,马上删除。

1.7 停止线程

停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前操作。

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

  1. 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程终止
  2. 使用 stop() 方法强行终止线程,已废弃,不推荐使用
  3. 使用 interrupt() 方法中断线程,经常使用

1.7.1 停止不了的线程

接下来会使用 interrupt() 方法,但这个方法不会真的停止线程,只是在当前线程中打了一个停止的标记

下面通过一个示例来说明:

  1. 创建一个自定义的线程类

    public class MyThread14 extends Thread {
         
         
        @Override
        public void run() {
         
         
            super.run();
            for (int i = 0; i < 500000; i++) {
         
         
                System.out.println(i);
            }
        }
    }
    
    
  2. 测试类

    public class MyThread14Test {
         
         
        public static void main(String[] args) {
         
         
            try {
         
         
                MyThread14 myThread14 = new MyThread14();
                myThread14.start();
                Thread.sleep(1000);
                myThread14.interrupt();
            } catch (InterruptedException e) {
         
         
                e.printStackTrace();
            }
        }
    }
    
    

    运行结果

    ...
    499990
    499991
    499992
    499993
    499994
    499995
    499996
    499997
    499998
    499999
    

分析:从运行结果来看,调用 interrupt() 方法并没有停止线程,那该如何停止线程呢?

1.7.2 判断线程是否是停止状态

在介绍如何如何停止线程前,先来看一下如何判断线程的状态是否是停止的。

Thread 类中提供了两种方法

  1. this.interrupted():测试当前线程是否已经是中断状态,当前线程是指运行 this.interrupted() 方法的线程,执行后具有将状态标志清除为 false 的功能
  2. this.isInterrupted():测试线程 Thread 对象是否已经是中断状态,但不清除状态标志

下面通过一个示例来演示 interrupted() 方法的使用:

  1. 创建一个自定义的线程类

    public class MyThread15 extends Thread {
         
         
        @Override
        public void run() {
         
         
            super.run();
            for (int i = 0; i < 50000; i++) {
         
         
                System.out.println(i);
            }
        }
    }
    
    
  2. 测试类

    public class MyThread15Test {
         
         
        public static void main(String[] args) {
         
         
            try {
         
         
                MyThread15 myThread15 = new MyThread15();
                myThread15.start();
                // 让 main 线程休眠 0.5 秒,这样线程规划器会先执行 myThread15 线程
                Thread.sleep(500);
                myThread15.interrupt();
                System.out.println("是否停止1 = " + myThread15.interrupted());
                System.out.println("是否停止2 = " + myThread15.interrupted());
            } catch (InterruptedException e) {
         
         
                e.printStackTrace();
            }
    
        }
    }
    
    

    运行结果

    ...
    40292
    40293
    40294
    40295
    是否停止1 = false
    40296
    40297
    ...
    40803
    40804
    40805
    是否停止2 = false
    40806
    40807
    40808
    40809
    ...
    

分析:

我们在测试类中调用了以下代码,来停止 myThread15 线程:

myThread15.interrupt();

但在后面又使用了以下代码,来判断当前线程是否停止:

System.out.println("是否停止1 = " + myThread15.interrupted());
System.out.println("是否停止2 = " + myThread15.interrupted());

但打印结果说明当前线程并未停止,再看看 interrupted() 方法的解释:测试当前线程是否已经是中断状态,当前线程是指运行 this.interrupted() 方法的线程

这个当前线程是 main 线程,它从未中断过,所以打印结果是两个 false

接下来让 main 线程产生中断,再看看:

  1. 创建测试类

    public class Test3 {
         
         
        public static void main(String[] args) {
         
         
            Thread.currentThread().interrupt();
            System.out.println("是否停止1 = " + Thread.interrupted());
            System.out.println("是否停止2 = " + Thread.interrupted());
        }
    }
    
    

    运行结果

    是否停止1 = true
    是否停止2 = false
    

分析:第一次调用 interrupted() 判断当前线程已经是中断状态了,然后清除了状态标志,所以第二次调用 interrupted() 方法的返回值是 false

介绍完 interrupted() 方法,下面通过一个示例来演示 isInterrupted() 方法的使用:

  1. 创建测试类

    public class MyThread15Test_2 {
         
         
        public static void main(String[] args) {
         
         
            try {
         
         
                MyThread15 myThread15 = new MyThread15();
                myThread15.start();
                // 让 main 线程休眠 0.5 秒,这样线程规划器会先执行 myThread15 线程
                Thread.sleep(500);
                myThread15.interrupt();
                System.out.println("是否停止1 = " + myThread15.isInterrupted());
                System.out.println("是否停止2 = " + myThread15.isInterrupted());
            } catch (InterruptedException e) {
         
         
             e.printStackTrace();
            }
     }
    }
    
    

    运行结果

    ...
    48254
    48255
    48256
    48257
    是否停止1 = true
    是否停止2 = true
    48258
    48259
    48260
    ...
    

分析:从打印结果上来看,测试 myThread15 线程已经是中断状态了,而且 isInterrupted() 方法并不清除状态标志,所以打印了两个 true

1.7.3 能停止的线程——异常法

有了前面学习的知识,就可以在 for 语句中判断一下线程是否是中断状态了,如果是中断状态,则后面的代码不再运行即可。

下面通过一个示例来演示异常法停止线程:

  1. 创建一个自定义的线程类

    public class MyThread16 extends Thread {
         
         
        @Override
        public void run() {
         
         
            super.run();
            try {
         
         
                for (int i = 0; i < 50000; i++) {
         
         
                    // 如果是中断状态就不再执行后面的代码了
                    if (this.interrupted()) {
         
         
                        System.out.println("我要退出了...");
                        throw new InterruptedException();
                    }
                    System.out.println(i);
                }
            } catch (InterruptedException e) {
         
         
                e.printStackTrace();
            }
        }
    }
    
    
  2. 测试类

    public class MyThread16Test {
         
         
        public static void main(String[] args) {
         
         
            try {
         
         
                MyThread16 myThread16 = new MyThread16();
                myThread16.start();
                Thread.sleep(500);
                myThread16.interrupt();
            } catch (InterruptedException e) {
         
         
                e.printStackTrace();
            }
        }
    }
    
    

    运行结果

    ...
    41332
    41333
    41334
    41335
    41336
    41337
    41338
    我要退出了...
    java.lang.InterruptedException
    	at MyThread16.run(MyThread16.java:9)
    
    

1.7.4 在沉睡中停止

如果线程在 sleep() 状态下停止线程,会是什么效果呢?

下面通过一个示例来演示:

  1. 创建一个自定义的线程类

    public class MyThread17 extends Thread {
         
         
        @Override
        public void run() {
         
         
            super.run();
            try {
         
         
                System.out.println("begin");
                Thread.sleep(100000);
                System.out.println("end");
            } catch (InterruptedException e) {
         
         
                System.out.println("线程沉睡中被中断,进入 catch !" + " this.interrupted() = "+this.interrupted());
                e.printStackTrace();
            }
        }
    }
    
    
  2. 测试类

    public class MyThread17Test {
         
         
        public static void main(String[] args) {
         
         
            try {
         
         
                MyThread17 myThread17 = new MyThread17();
                myThread17.start();
          
Java 多线程编程核心技术笔记——第3 线程间通信( 目录3.1 等待/通知机制3.1.11 生产者/消费者模式实现3.1.11.1 一生产与一消费:操作值3.1.11.2 多生产与多消费:操作值——假死3.1.11.3 多生产与多消费:操作值3.1.11.4 一生产与一消费:操作栈3.1.11.5 一生成与多消费——操作栈:解决 wait 条件改变和假死3.1.11.6 多生产与一消费3.1.11.7 多生产与多消费:操作栈3.1.12 通过管道进行线程间通信:字节流3.1.13 通过管道进行线程间通信:字符流3.1.14 实战:等待/通知之交换备份 阅读详情

相关推荐

Java多线程编程核心技术1.Java多线程技能-笔记总结

相关链接: 【java多线程编程核心技术1.java多线程技能-笔记总结 【java多线程编程核心技术】2.对象及变量的并发访问(上)-笔记总结 【java多线程编程核心技术】2.对象及变量的并发访问(下)-笔记总结 【java多线程编程核心技术】3.线程间通信 -笔记总结 【java多线程编程核心技术】4.Lock的使用-笔记总结 【java多线程编程核心技术】5.定时器Timer

DChuan 1664

Java编程的终极导航:《Java核心技术》系列全面解读

编程世界中,Java的位置无可替代,无论是企业级应用、移动应用开发,还是大数据处理,Java都扮演着重要的角色。对于刚刚踏入这个领域的新手来说,有一条清晰的路线图是非常必要的;而对于经验丰富的开发者而言,及时更新知识库、了解新技术同样重要。这时,`《Java核心技术 卷I:开发基础(原书第12版)》`与`《Java核心技术 卷II:高级特性(原书第12版)》`便是你的灯塔,为你的Java学习之旅指引方向

hacker707的博客 2万+

Java多线程编程核心技术》——多线程总结

1 Java多线程技能主要介绍线程和进程的相关概念,多线程的实现和停止,以及Thread类中的核心方法,具体实现的代码可以参考《Java多线程编程核心技术》。 进程和线程 1.进程 一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。简单的说,进程就是一个程序的一次执行过程。 2.引入线程的动机和思路 操作系统采用进程机制使得多任务...

weixin_39754631的博客 4178

Java 多线程编程核心技术笔记——第1 Java 多线程技能(一)

目录1.1 进程和多线程的概念及线程的优点1.2 使用多线程1.2.1 继承 Thread 类1.2.2 实现 Runnable 接口1.2.3 实例变量与线程安全1.2.4 留意 i-- 与 System.out.println() 的异常1.3 currentThread() 方法1.4 isAlive() 方法1.5 sleep() 方法1.6 getId() 方法1.7.2 判断线程...

bm1998 342

Java多线程编程核心技术》学习笔记1

一、实现多线程编程方式 (1)继承Thread类 public class MyThread extends Thread { @Override public void run() { super.run(); System.out.println(&amp;amp;amp;amp;quot;MyThread&amp;amp;amp;amp;quot;); } } public class Run { publi

洋YANG的博客 1万+

Java多线程编程核心技术教程

Java多线程编程核心技术教程 1. 项目介绍 java-multi-thread-programming 是一个开源项目,旨在提供《Java多线程编程核心技术》一书的源码,方便读者参考和学习Java多线程编程。该项目由高洪严编写,并由机械工业出版社出版。项目中的代码按照节、节和小节进行组织,每个节和节都有对应的代码示例,帮助读者更好地理解和实践Java多线程编程。 2. 项目快速启动 2.1...

gitblog_00332的博客 853

Java】《Java多线程编程核心技术1多线程技能

目录 前言 导图展示 进程和线程的概念 一、概念理解 多线程实现方式 常用线程方法 小结 前言 小编最近在看一本多线程书籍《Java多线程编程核心技术》,里面讲到了线程的一些基础知识,书中全部用案例来讲解技术点的实现,使读者看到代码及运行结果后就可以知道此此项目要解决的是什么问题。 本书就像“瑞士军刀”一样,精短小,但却非常锋利,可帮读者快速学习...

冯浩月 606

Java 多线程编程核心技术

进程是操作系统的基础,是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动;是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。可以理解为在一个进程中独立运行的子任务。进程虽然是互相独立的,但它们可以互相通信的,较为通用的方式是使用 Socket 或 HTTP 协议。进程拥有共享的系统资源,比如内存,网络端口,供其内部线程使用。进程较重,因为创建进程需要操作系统分配资源,会占用内存。线程存在于进程中,是进程的一个子集,现有进程,后有线程。

weixin_45278293的博客 1582

Java多线程编程核心技术》(一)多线程技能

最近阅读了一本《Java多线程编程核心技术》,总结了一下每的知识点:第一java多线程技能 知识点:1,实现多线程编程的方式主要有两种:一是继承Thread类,重新run方法,是实现Runnable接口,实现run方法,对象作为构造参数传入Thread对象进行start()启动。(第种方式支持多继承情况)2,currentThread()方法可以返回代码段正在被哪个线程调用的信息。 Th

一名java从业者的专栏 2148

Java多线程编程核心技术》迎来重大更新

不管是学习JavaSE、JavaEE、JavaWeb,还是学习Java大数据、Java移动开发、Java分布式、Java微服务,“多线程编程”都是必不可少的核心技术点。《Java多线程核心...

华章IT官方博客 956

Java多线程编程核心技术》推荐

写这篇博客主要是给猿友们推荐一本书《Java多线程编程核心技术》。之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象。只要你有一点点Java基础,你就可以尝试去阅读它,相信定会收获甚大!博主之前网上找了很久都没pdf电子版的,只有不全的阅读版,这里博主提供免费清晰完整版供各位猿友下载: http://download.csdn.net/detai

小宝鸽 2万+

Java多线程编程核心技术笔记:第1 多线程技能

1、进程和线程的区别: (1)进程可以理解为一个程序的执行。如果说QQ. (2)线程可以理解为在一个进程中独立运行的子任务。比如说:QQ运行时有:和好友视频的线程,传输数据的线程,发送表情的线程等等。 多任务操作系统,如Windows系列就是通过多个线程来处理任务的。 多任务环境:异步(多个线程同时执行)。 单任务环境:异步(只有一个线...

Windsearcher的博客 206

java核心技术1总结

在该中, 我觉得没有什么太重要的东西, 但是关于1.2节中的 java "白皮书" 的关键术语应该了解下并能够理解它,  所谓的"白皮书"关键术语其实指的就是java的特性. java的特性包括: 简单性, 面向对象, 网络技能(Network-Savvy), 健壮性, 体系结构中立, 可移植性,  解释型, 高

a62894310的专栏 1093

Java多线程编程核心技术》--第1--Java多线程技能

介绍Thread类中的核心方法。重点掌握如下关键技术点:线程的启动如何使线程暂停如何使线程停止线程的优先级线程安全相关的问题这5点时本学习的重点与思路。1.1 进程和多线程的概念及线程的优点 讲到线程,我们要先介绍进程。 我们可以将一个正在操作系统中运行的exe程序理解成一个“进程”。进程是受操作系统管理的基本运行单元。 线程可以理解成是在进程中独立运行的子任务。比如,QQ.exe运行时就有...

csdn_kenneth的博客 297

新书推荐 |《Java多线程编程核心技术(第2版)》

新书推荐《Java多线程编程核心技术(第2版)》点击上图了解及购买技术畅销书全新升级,案例式讲解,逐一分析和验证每个技术点。编辑推荐1)技术畅销书全新升级,案例式讲解,逐一分析和验证每个...

华章IT官方博客 578

java多线程编程核心技术 第2版_推荐5本纯Java技术书,你看过几本?

要说编程什么火?还是Java!目前自学或者到培训机构学习Java的人有很多,但是大家对于学习Java的书籍却不是很了解,今天推荐一些Java学习书籍!多看书对提升技能还是挺快的,毕竟都是大佬长时间整理出来的精华,很多问题也能在书中找到正确答案,迎刃而解,坚持看书,你将与同龄人拉开差距。正好我好久没给大家推荐书单了,今天给大家推荐 5 本 Java 相关的书单,助你巩固 Java 核心技术,看看你都...

weixin_39543478的博客 1344

java多线程编程核心技术

java多线程编程核心技术

cout_s的博客 411

Java多线程核心技术1 - 多线程技能

Java多线程核心技术1-多线程技能Java多线程技能1.1 使用多线程继承Thread类实现Runnable接口线程安全问题1.2 Thread相关方法currentThread()isAlive()sleep()getId()yield()1.3 停止线程stop() 方法停止状态利用 interrupt 优雅停止非睡眠状态:利用异常停止睡眠状态:利用异常停止非睡眠状态:利用return停止1.4 暂停线程suspend 与 resume独占不同步1.5 线程优先级1.6 守护线程 来自阅读Java

weixin_42593937的博客 341
上一篇: 《计算机网络》笔记——第4章 网络层(二)
下一篇: 《Java 多线程编程核心技术》笔记——第2章 对象及变量的并发访问(二)
bm1998
博客等级 码龄9年 4214粉丝 287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bm1998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值