Java并发编程示例(三):线程中断

 更新时间:2014年12月05日 09:55:12   投稿:junjie  
这篇文章主要介绍了Java并发编程示例(三):线程中断,在本节,我们所开发的示例程序将会创建一个线程,五秒钟后,利用中断机制强制中止这个线程,需要的朋友可以参考下

一个多线程的Java程序,直到所有线程执行完成,整个程序才会退出。(需要注意的是,是所有非后台线程(non-daemon thread)执行完成;如果一个线程执行了System.exit()方法,程序也会退出。)有时,你想中止一个线程的执行,例如你想退出程序,或者你想取消一个正在执行的任务等。

Java提供了中断机制,可以让我们显式地中断我们想中止执行的线程。中断机制的一个特征就是我们可以检查线程是否已经被中断,进而决定是否响应中止请求。线程也可以忽略中止请求,继续执行。

在本节,我们所开发的示例程序将会创建一个线程,五秒钟后,利用中断机制强制中止这个线程。

知其然

按照下面步骤所示,完成示例程序。

1.创建一个名为PrimeGenerator的类,并且继承Thread类。代码如下:

复制代码 代码如下:

public class PrimeGenerator extends Thread {

2.重写run()方法,在方法中添加一个无限循环,在循环内,通过计算来检查从1开始的连续正整数是否为素数。如果是,则打印到控制台。代码如下:
复制代码 代码如下:

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

3.在处理一个数字之后,通过调用isInterrupted()方法来检查线程是否被中断。如果该方法返回true,则向控制台打印一句话,然后中止线程执行。代码如下:
复制代码 代码如下:

        if (isInterrupted()) {
            System.out.println("The Prime Generator has been Interrupted");
            return;
        }

        number++;
    }
}

4.实现isPrime()方法,该方法用于判断参数是否为素数,如果是则返回true,否则返回false。代码如下:

复制代码 代码如下:

/**
 * 判断参数是否为素数
 *
 * @param number 需要判断的数字
 * @return
 */
private boolean isPrime(long number) {
    if (number <= 2) {
        return true;
    }

    for (int i = 2; i < number; i++) {
        if ((number % i) == 0) {
            return false;
        }
    }

    return true;
}


5.现在,实现示例程序的主类,Main类,同时实现main()方法。代码如下:
复制代码 代码如下:

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

6.创建一个PrimeGenerator对象,并且启动该线程。代码如下:
复制代码 代码如下:

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

7.等待五秒钟,然后中止该线程。代码如下:
复制代码 代码如下:

try {
    TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
    e.printStackTrace();
}

task.interrupt();


8.运行该示例,查看结果。

知其所以然

下面的是示例程序执行的打印片段。我们从打印出的字符可以看出PrimeGenerator线程是如何打印输出信息以及当检测到线程被中断时,如何中止其执行的。

复制代码 代码如下:

Number 43063    is Prime.
Number 43067    is Prime.
Number 43093    is Prime.
Number 43103    is Prime.
Number 43117    is Prime.
The Prime Generator has been Interrupted

Thread有一个布尔型的熟悉,来表明线程是否被中断。当调用interrupt()方法时,就是将其设置为true。而isInterrupted()方法则是返回该属性的当前值。

永无止境

Thread还有一个可以检查线程是否中断的方法:即静态方法interrupted(),可以检查当前正在执行的线程是否被中断。

复制代码 代码如下:

isInterrupted()方法和interrupted()方法有非常大的不同。前者不会改变线程是否中断的属性值;而后者则可以将其值设置为false。interrupted()是一个静态方法;平时开发推荐使用isInterrupted()方法。

正如前面所述,线程可以忽略中断请求而继续执行。但是,这并不是我们想要的结果。

拿来主义

本文是从 《Java 7 Concurrency Cookbook》 (D瓜哥窃译为 《Java7并发示例集》 )翻译而来,仅作为学习资料使用。没有授权,不得用于任何商业行为。

小有所成

示例程序所用的所有代码的完整版本。

PrimeGenerator类的完整代码

复制代码 代码如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe3;

/**
 * Date: 2013-09-18
 * Time: 11:53
 */
public class PrimeGenerator extends Thread {

    @Override
    public void run() {
        long number = 1L;
        while (true) {
            if (isPrime(number)) {
                System.out.printf("Number %d \tis Prime.\n", number);
            }

            if (isInterrupted()) {
                System.out.println("The Prime Generator has been Interrupted");
                return;
            }

            number++;
        }
    }

    /**
     * 判断参数是否为素数
     *
     * @param number 需要判断的数字
     * @return
     */
    private boolean isPrime(long number) {
        if (number <= 2) {
            return true;
        }

        for (int i = 2; i < number; i++) {
            if ((number % i) == 0) {
                return false;
            }
        }

        return true;
    }
}

Main类的完整代码

复制代码 代码如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe3;

import java.util.concurrent.TimeUnit;

/**
 * Date: 2013-09-18
 * Time: 12:33
 */
public class Main {
    public static void main(String[] args) {
        Thread task = new PrimeGenerator();
        task.start();

        try {
            TimeUnit.SECONDS.sleep(5L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        task.interrupt();
    }
}

相关文章

  • SpringBoot排除不需要的自动配置类DataSourceAutoConfiguration问题

    SpringBoot排除不需要的自动配置类DataSourceAutoConfiguration问题

    这篇文章主要介绍了SpringBoot排除不需要的自动配置类DataSourceAutoConfiguration问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java 变量类型及其实例

    Java 变量类型及其实例

    这篇文章主要讲解Java中变量的类型以及实例,希望能给大家做一个参考
    2017-04-04
  • Springboot处理配置CORS跨域请求时碰到的坑

    Springboot处理配置CORS跨域请求时碰到的坑

    本篇文章介绍了我在开发过程中遇到的一个问题,以及解决该问题的过程及思路,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • 分析JVM的组成结构

    分析JVM的组成结构

    JVM(虚拟机):指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。JVM和VMware,Virtual Box等虚拟机一样,都是运行在操作系统之上的计算机系统
    2021-06-06
  • JAVA中单元测试的常用方式(小结)

    JAVA中单元测试的常用方式(小结)

    这篇文章主要介绍了JAVA中单元测试的常用方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 关于Java继承中父类和子类构造函数的问题

    关于Java继承中父类和子类构造函数的问题

    这篇文章主要介绍了关于Java继承中父类和子类构造函数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Springmvc数据回显实现原理实例解析

    Springmvc数据回显实现原理实例解析

    这篇文章主要介绍了Springmvc数据回显实现原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 简单易懂的java8新特性之lambda表达式知识总结

    简单易懂的java8新特性之lambda表达式知识总结

    一直想针对lambda表达式作一个总结,借助于这次公司安排的考试作一个入门式的总结,对正在学习java的小伙伴们非常有帮助,需要的朋友可以参考下
    2021-05-05
  • Java获取登录用户的IP地址示例代码

    Java获取登录用户的IP地址示例代码

    在开发中我们经常需要获取用户IP地址,通过地址来实现一些功能,下面这篇文章主要给大家介绍了关于Java获取登录用户的IP地址的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 五分钟教你手写 SpringBoot 本地事务管理实现

    五分钟教你手写 SpringBoot 本地事务管理实现

    这篇文章主要介绍了五分钟教你手写 SpringBoot 本地事务管理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论