多线程Java程序,只有在所有线程执行结束时(特别是所有非守护程序线程关闭或线程调用()方法调用时)才会运行。

有时,为了终止程序或者取消一个线程对象所执行的任务,我们需要终止一个线程。

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)) {
Sy("Number %d is Primen", number);
}

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

if (isInterrupted())
Sy ("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();
()

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

try{
T(5000);
}catch (InterruptedException e) {
e.printstackTrace();
}
();

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

Sy, printf("Main: status of the Thread: %sn",task,getstate());
Sy, printf("Main: isInterrupted: %sn",());
Sy, printf("Main: isAlive: %sn", 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的元素,包括基本配方,这些帮助您利用激动人心的新功能。您将学习如何使用并行和反应流来处理大规模数据集。接下来,您将继续创建流,并使用他们所有中间和终端的操作以一种并行且函数性的方式来进行数据的收集。此外,你会了解一系列的实战方式,如线程管理、同步、执行人、并行和反应流等。

相关推荐