一个多线程Java程序,只有当其全部线程执行结束时(更具体地说,是所有非守护线程结束或者某个线程调用system.exit()方法的时候) ,才会结束运行。有时,为了终止程序或者取消一个线程对象所执行的任务,我们需要终止一个线程。

Java使用一种中断机制来向线程表明想要终止它。这个中断机制依靠线程对象来检查是否需要中断,同时线程对象可以决定是否响应中断请求。当然,一个线程对象也可以忽略中断请求继续执行。

本节将开发一个应用程序,它的作用是在线程创建5s后,使用中断机制强制结束线程。

项目准备

本案例是用Eclipse IDE来实现的。如果开发者使用Eclipse或者其他IDE (例如NetBeans ) ,则应打开它并创建一个新的Java项目。

案例实现

根据以下步骤来完成本案例。

1,创建一个名为PrimeGenerator 的类,并继承Thread类:

public class PrimeGenerator extends Thread{

2.重写run()方法——该方法包含一个无限while 循环。在循环中,处理从1开始的连续数字。如果是奇数,那么将其输出到控制台:

@Overridpublic void run() {long number=1L;while (true) {if (isPrime(number)) {System.out.printf("Number %d is Prime", number);}

3,每处理完一个数字,通过isInterrupted()方法来判断当前线程是否已被中断。如果该方法返回true ,那么表明当前线程已被中断。在这种情况下,在控制台上打印一条信息并终止线程:

if (isInterrupted())System.out.printf ("The Prime Generator has been Interrupted");return;}number++;}}

4,实现isPrime()方法。详细代码参见1.2节。

5,现在,开始实现应用程序的主类,创建包含main()法的Main类:

public class Main{public static void main(string[] args) t

6,创建PrimeGenerator类的对象,并启动它:

Thread task=new PrimeGenerator();task.start()

7·在主线程中等待5s后,中断PrimeGenerator线程:

try{Thread.sleep(5000);}catch (InterruptedException e) {e.printstackTrace();}task.interrupt();

8,输出中断线程的状态。这段代码的输出结果取决于它是在线程结束前还是线程结束后运行的:

System.out, printf("Main: status of the Thread: %s",task,getstate());System.out, printf("Main: isInterrupted: %s",task.isInterrupted());System.out, printf("Main: isAlive: %s", task,isAlive());}

9,运行案例并查看结果。

结果分析

下面是以上案例运行结果的截图。从图中可以看到, PrimeGenerator线程在检测到自己被中断后,输出信息并结束了运行。

Thread类有一个用来保存线程是否已被中断的状态属性,其属性值为 boolean类型,默认值为false 。当调用一个线程对象的interrupt()方法时,该状态属性将修改为true 。而方法isInterrupted() 仅返回该状态属性的值。

在main()方法中,输出了中断线程的一些状态信息。在本案例中,虽然在这些代码之前调用了线程的中断,但是在执行这些代码时,任务线程并未执行到中断判断和处理过程,因此,此时输出的线程状态为RUMMABL E ,方法 isInterrupted()的结果为 true ,当然方法isAlive() 的结果也为true 。如果这些代码执行是在Thread中断完成之后[可以制造机会,如通过在main调用sleep() 使得主线程休眼1s,使得task 线程完成中断,那么 isInterrupted )和 isAlive() 的结果将为false 。.

其他说明

在Thread类中,还有一个静态办法interrupted(),也能用来检测当前线程是否已被中断。

正如前文所说,线程对象可以忽略中断,但这并不是被预期的行为。

本文节选自《Java 9 并发编程实战》

本书将带你了解所有的新API,向您展示如何构建并行多线程应用程序。这本书涵盖了所有Java并发API的元素,包括基本配方,这些帮助您利用激动人心的新功能。您将学习如何使用并行和反应流来处理大规模数据集。接下来,您将继续创建流,并使用他们所有中间和终端的操作以一种并行且函数性的方式来进行数据的收集。此外,你会了解一系列的实战方式,如线程管理、同步、执行人、并行和反应流等。

c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法相关推荐

  1. java 高并发第三阶段实战_JAVA多线程编程实战视频-第三阶段(共80节)

    高并发编程第三阶段01讲 AtomicInteger多线程下测试讲解 高并发编程第三阶段02讲 AtomicInteger API详解,以及CAS算法详细介绍 高并发编程第三阶段03讲 利用CAS构造 ...

  2. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  3. java 并发编程实例_Java并发编程案例解读

    经过前面几节的学习,了解了多线程概念.Thread类的应用.多线程数据同步存在的问题及解决方法.本节给出一个并发编程实例应用案例,通过案例的学习,可以灵活地把多线程知识应用到实际编程中,解决在项目开发 ...

  4. Java并发基础总结_Java并发编程笔记之基础总结(二)

    一.线程中断 Java 中线程中断是一种线程间协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是需要被中断的线程根据中断状态自行处理. 1.void interrupt() 方法:中断线 ...

  5. java并发编程笔记_java并发编程笔记(一)——并发编程简介

    java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...

  6. java并发编程介绍_java并发编程《一》介绍

    1,并发的简短历史 1,OS的发展使多个程序同时运行,程序在各自的进程(process)中运行:相互分离,各自独立执行,有OS来分配资源,比如内存,文字句柄,安全证书.如果有需要的话,进程会通过一些原 ...

  7. 对java支持并发的理解_Java并发知识(1)

    1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...

  8. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

  9. java编程源代码_java经典编程300例源代码下载

    java经典编程300例源代码是针对java编程的编程源代码.以基础知识为框架,介绍了各部分知识所对应的常用开发实例,并进行了透彻解代码解析和知识扩展4部分,每一部分都进行了细致的说明.__java经 ...

最新文章

  1. 【VB】学生信息管理系统4——数据库的发展
  2. C语言指针的一些题目
  3. QUIC DataChannels的第一步
  4. 能“看穿”换脸视频背后的AI模型,Facebook的反Deepfake方法有点东西
  5. Realsense无法启动彩色摄像头
  6. 概率软逻辑(PSL,Probabilistic soft logic)通用(可处理中文)版本
  7. SpringMVC基础配置
  8. 如何用python写程序设置当前打印机为默认打印机,从Python打印到标准打印机?
  9. 有了这两本书,学习领域驱动设计会很容易
  10. Java毕设项目车辆调度管理系统计算机(附源码+系统+数据库+LW)
  11. Java 对 Excel 修改
  12. datamap excel插件_Excel地图插件 DataMap
  13. 【Leetcode刷题篇】leetcode739 每日温度
  14. undefined和is not defined一样吗?
  15. 浏览器、html、css面试题(三)
  16. 三星宣布Bixby拓展到电视洗衣机冰箱上 要把家电统统连接 | CES
  17. 中投民生:“巨无霸”上市估值2000亿美金直接超越茅台
  18. 使用遗传算法实现迷宫游戏(genetic maze)
  19. 数据基础设施白皮书2019
  20. 林语堂:我生之初尚无为

热门文章

  1. C#多线程与UI响应 防止界面假死不响应(子线程创建的窗体获取消息响应用Application.DoEvent )
  2. uni-app使用input框 v-model双向绑定不起作用解决方案
  3. IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天
  4. Matlab 字符串比较
  5. 图片优化_Web 性能优化: 图片优化让网站大小减少 62%
  6. python3一个中文3个字符_高手接招! 小应用 用python3判断一个字符串是不是中文组成的...
  7. python轮胎_如何用数据分析方法剖析途虎轮胎数据
  8. python iter next_python类中的__iter__, __next__与built-in的iter()函数举例
  9. eclipse 关闭时progress information弹框_如何关闭 iPhone 中的评分和好评弹窗?
  10. IOS 远程测试方案