文档章节

并发编程实战 1.3. 线程的中断 - interrupt()与isInterrupted()

火犀牛
 火犀牛
发布于 2016/05/10 21:44
字数 421
阅读 12
收藏 0

Java 提供了中断几只,我们可以使用它来结束一个线程。这种机制要求线程检查它是否被中断了,然决定是不是响应这个中断请求,或者继续执行。

范例:打印质数,2秒后结束

方法一:手动控制

package com.rr.concurrent.chapter1.recipe3.test;

/**
 * Created by isaac_gu on 2016/5/10.
 */
public class Task implements Runnable {

    @Override
    public void run() {
        Thread thread = Thread.currentThread();
        int i = 0;
        while (i++ >= 0) {
            if (thread.isInterrupted()) {
                System.out.println("线程被打断了!");
                //return;
                System.exit(0);
            } else if (isPrime(i)) {
                System.out.printf("%d 是 质数\r\n", i);
            }
        }
    }

    /**
     * 百度百科的实现方法
     *
     * @param n
     * @return
     */
    public static boolean isPrime(long n) {
        if (n <= 3) {
            return n > 1;
        }
        if (n % 2 == 0 || n % 3 == 0) {
            return false;
        }

        for (int i = 5; i * i <= n; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }
}

测试:

package com.rr.concurrent.chapter1.recipe3.test;


import java.util.concurrent.TimeUnit;

/**
 * Created by isaac_gu on 2016/5/10.
 * 打印质数,2秒后结束
 */
public class Test {
    public static void main(String[] args) {
        Thread thread = new Thread(new Task());
        thread.start();

        //睡眠2秒
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //2秒后打断
        thread.interrupt();

    }


}

检查线程是否被中断的方法有两种: isInterrupted() 和 静态方法Thread.interrupted();

方法二: 使用异常

package com.rr.current2.c1_3_interruptException.test;

/**
 * Created by Isaac on 16-5-10.
 */

/**
 * Created by isaac_gu on 2016/5/10.
 */
public class Task implements Runnable {

    @Override
    public void run() {
        try {
            print();
        } catch (InterruptedException e) {
            System.out.printf("%s: 线程被打断了!", Thread.currentThread().getName());
        }
    }

    public void print() throws InterruptedException {
        int i = 0;
        while (i++ >= 0) {
            if(Thread.interrupted()){
                throw new InterruptedException();
            } else if (isPrime(i)) {
                System.out.printf("%d 是 质数\r\n", i);
            }
        }
    }
    /**
     * 百度百科的实现方法
     *
     * @param n
     * @return
     */
    public static boolean isPrime(long n) {
        if (n <= 3) {
            return n > 1;
        }
        if (n % 2 == 0 || n % 3 == 0) {
            return false;
        }

        for (int i = 5; i * i <= n; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }
}

 

© 著作权归作者所有

共有 人打赏支持
火犀牛
粉丝 0
博文 27
码字总数 12180
作品 0
海淀
程序员
私信 提问
Java并发编程原理与实战四:线程如何中断

如果你使用过杀毒软件,可能会发现全盘杀毒太耗时间了,这时你如果点击取消杀毒按钮,那么此时你正在中断一个运行的线程。 java为我们提供了一种调用interrupt()方法来请求终止线程的方法,下...

pony1223
07/21
0
0
Java多线程 - 如何正确的终止线程

最近打算读一下《实战java高并发程序设计》,夯实一下java多线程的知识。接下来应该会写一系列的读书笔记,里面会有多处引用到书中的代码或者文字。本文就是第一篇。 不推荐使用的stop方法 Th...

嘉伟咯
2017/08/24
0
0
Java编程的逻辑 -- 并发章 -- 线程的中断

线程中断 线程不同状态对中断的反应 总结 线程中断 在Java中,停止一个线程的主要机制是中断,中断并不是强迫终止一个线程,它是一种协作机制,是给线程传递一个取消信号,但是由线程来决定如...

HikariCP
06/25
0
0
Java并发编程学习一:线程的概念以及使用

该篇文章作为自己并发学习的一个开始,首先介绍一下线程的概念以及使用。 讨论基于单核cpu进行 线程的意义 要了解线程的意义,首先先介绍一下进程,什么是进程?进程概念如下(摘自百度百科)...

JerryLin123
11/10
0
0
多线程编程读书笔记之线程中断的本质

Java试图提供过抢占式限制中断,但问题多多,例如已被废弃的Thread.stop、Thread.suspend和 Thread.resume等。另一方面,出于Java应用代码的健壮性的考虑,降低了编程门槛,减少不清楚底层机...

刘学炜
2012/07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
3
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
2
0
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public v......

go4it
昨天
6
0
CentOS 生产环境配置

初始配置 对于一般配置来说,不需要安装 epel-release 仓库,本文主要在于希望跟随 RHEL 的配置流程,紧跟红帽公司对于服务器的配置说明。 # yum update 安装 centos-release-scl # yum ins...

clin003
昨天
9
0
GPON网络故障处理手册

导读 为了方便广大网络工作者工作需要,特搜集以下GPON网络处理流程供大家学习参考。开始—初步定为故障—检查光纤状况—检查ONU状态--检查设备运行状态—检查设备数据配置—检查上层设备状态...

问题终结者
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部