gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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();     } } 。

  。

最后此篇关于Java并发编程示例(三):线程中断的文章就讲到这里了,如果你想了解更多关于Java并发编程示例(三):线程中断的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com