网站首页 > java教程 正文
一个多线程Java程序,只有当其全部线程执行结束时(更具体地说,是所有非守护线程结束或者某个线程调用system.exit()方法的时候) ,才会结束运行。有时,为了终止程序或者取消一个线程对象所执行的任务,我们需要终止一个线程。
Java使用一种中断机制来向线程表明想要终止它。这个中断机制依靠线程对象来检查是否需要中断,同时线程对象可以决定是否响应中断请求。当然,一个线程对象也可以忽略中断请求继续执行。
本节将开发一个应用程序,它的作用是在线程创建5s后,使用中断机制强制结束线程。
项目准备
本案例是用Eclipse IDE来实现的。如果开发者使用Eclipse或者其他IDE (例如NetBeans ) ,则应打开它并创建一个新的Java项目。
案例实现
根据以下步骤来完成本案例。
1,创建一个名为PrimeGenerator 的类,并继承Thread类:
public class PrimeGenerator extends Thread{
2.重写run()方法——该方法包含一个无限while 循环。在循环中,处理从1开始的连续数字。如果是奇数,那么将其输出到控制台:
@Overrid
public void run() {
long number=1L;
while (true) {
if (isPrime(number)) {
System.out.printf("Number %d is Prime\n", 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\n",task,getstate());
System.out, printf("Main: isInterrupted: %s\n",task.isInterrupted());
System.out, printf("Main: isAlive: %s\n", 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的元素,包括基本配方,这些帮助您利用激动人心的新功能。您将学习如何使用并行和反应流来处理大规模数据集。接下来,您将继续创建流,并使用他们所有中间和终端的操作以一种并行且函数性的方式来进行数据的收集。此外,你会了解一系列的实战方式,如线程管理、同步、执行人、并行和反应流等。
猜你喜欢
- 2024-10-13 GitHub热点推荐!85W字并发编程图册(全彩版),竟是出自阿里
- 2024-10-13 「不得不看」Java并发编程一(java并发编程之美)
- 2024-10-13 深入理解java并发编程、并发编程相关概念基础篇
- 2024-10-13 Java 高并发编程详解:多线程与架构设计首稿写作完成
- 2024-10-13 Java面试专题——并发编程(juc并发编程面试题)
- 2024-10-13 Java编程——如何实现高效的并发控制
- 2024-10-13 Java线程与并发编程实践:深入理解volatile和final变量
- 2024-10-13 简单理解JAVA并发编程及高并发(java并发编程实战和并发编程的艺术)
- 2024-10-13 高并发编程系列:全面剖析Java并发编程之AQS的核心实现
- 2024-10-13 Java 多线程并发编程(关于java多线程并发控制机制)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)