线程管理(三)线程的中断

简介:

线程的中断

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

Java提供中断机制来通知线程表明我们想要结束它。中断机制的特性是线程需要检查是否被中断,而且还可以决定是否响应结束的请求。所以,线程可以忽略中断请求并且继续运行。

在这个指南中, 我们将开发一个程序,它创建线程,然后在5秒之后,它会使用中断机制来强制结束线程。

 

准备

指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

怎么做呢

按照这些步骤来实现下面的例子::

1.   创建一个名为PrimeGenerator的类,扩展Thread类。


1 public class PrimeGenerator extends Thread{

2.   覆盖 run()方法,写一个无限循环的while循环。在循环里,我们将从1开始处理连续的数字。对于每个数字,如果它是质数,那么,我们就把它写入到操控台。


1 @Override
2 public void run() {
3   long number=1L;
4   while (true) {
5      if (isPrime(number)) {
6         System.out.printf("Number %d is Prime",number);
7      }

3.   处理完一个数字, 调用isInterrupted()方法来检查线程是否被中断了。如果它返回值为真,就写一个信息并结束线程的运行。


1 if (isInterrupted()) {
2    System.out.printf("The Prime Generator has been Interrupted");
3    return;
4 }
5 number++;
6 }
7 }

4.   实现isPrime()方法. 它返回 boolean 值表明接收到的数字是否是质数。


01 private boolean isPrime(long number) {
02   if (number <=2) {
03     return true;
04   }
05  
06   for (long i=2; i<number; i++){
07     if ((number % i)==0) {
08        return false;
09     }
10   }
11   return true;
12 }

5.   现在, 实现一个名为Main的类,包括实现main()方法来实现例子的Mian类。


1 public class Main {
2    public static void main(String[] args) {

6.   创建并开始一个PrimeGenerator类的对象。


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

7.   等待5秒,然后中断 PrimeGenerator 方法。


1 try {
2    Thread.sleep(5000);
3 } catch (InterruptedException e) {
4    e.printStackTrace();
5 }
6 task.interrupt();

8.   运行并查看结果。

它是如果工作的

下面是以上例子的运行结果这截图。我们可以发现 PrimeGenerator 线程是如何检测到它被中断了然后写了信息并结束运行的。 请看截图:

1-3

Thread 类还有一个boolean类型的属性来表明线程是否被中断。当你调用线程的interrupt() 方法,就代表你把这个属性设置为 true。 而isInterrupted() 方法仅返回属性值。

更多

Thread 类还有其他可以检查线程是否被中断的方法。例如,这个静态方法interrupted()能检查正在运行的线程是否被中断。

isInterrupted()和interrupted() 方法有着很重要的区别。

第一个不会改变interrupted属性值,但是第二个会设置成false。

interrupted() 方法是一个静态方法,建议使用isInterrupted()方法。

在之前提到的,线程是可以忽略中断指令的,但是并这不是我们所期望的行为。 

目录
相关文章
|
6月前
|
Java API 调度
线程的中断(interrupt)机制
线程的中断(interrupt)机制
79 1
|
6月前
|
消息中间件 存储 算法
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
169 0
|
Java
如何用Java编写代码来中断一个线程??
如何用Java编写代码来中断一个线程??
44 0
|
安全 Java 开发者
【JavaSE专栏82】线程中断,发送一个中断信号给另一个线程,让它中断当前的执行
【JavaSE专栏82】线程中断,发送一个中断信号给另一个线程,让它中断当前的执行
|
安全 算法 Java
去某东面试遇到并发编程问题:如何安全地中断一个正在运行的线程
一个位5年的小伙伴去某东面试被一道并发编程的面试题给Pass了,说”如何中断一个正在运行中的线程?,这个问题很多工作2年的都知道,实在是有些遗憾。 今天,我给大家来分享一下我的回答。
94 0
|
6月前
|
存储 开发框架 安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
427 0
|
Java 调度
《JavaSE-第二十一章》之线程的状态与中断
《JavaSE-第二十一章》之线程的状态与中断
【Java|多线程与高并发】线程的中断的两种方法
线程中断是指在一个线程执行的过程中,强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束.
三种方式中断运行的线程?(interrupt 方法)
三种方式中断运行的线程?(interrupt 方法)
98 0
|
监控 Java
一文了解JAVA线程的中断(Interrupt)机制
一文了解JAVA线程的中断(Interrupt)机制
1039 0
一文了解JAVA线程的中断(Interrupt)机制